[AHOI2002]哈利-波特与魔法石

题目

Description

Input

  • 文件中第一行有七个数,分别是 S1、 S2 、 …、 S7 ;第二行有两个数,依次分别是起点城市 i 和终点城市 j ;第三行有一个正整数 c ,c<=10000, 表示随后的 c 行中每行存放了一对能直接通达的城市的信息。 能直接通达的城市的信息由三个数组成, 依次分别是两个城市的编号和这两个城市之间的地形。城市的编号都是不超过 100 的正整

    数, 但是各个城市的编号未必连续。 文件里同一行中相邻的两个数都是用一个空白字符隔开的。

Output

以一行的形式输出起点城市i 与终点城市 j 之间的最快路线所需要的时间。

Sample Input

0 1 0 0 0 0 0
1 4
4
1 2 1
1 3 1
2 4 2
3 4 3

Sample Output

5

思路

可以直接设 $a[x][y]$ 为$x$ 到 $y$ 的距离;

然后如果这种地形有魔法石,那么 $a[x][y]/=2$ ;

最后跑一遍 $Floyd$ 就好了;

代码

#include<bits/stdc++.h>
#define re register
typedef long long ll;
using namespace std;
inline ll read()
{
    ll a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}//快读 
ll n,m;
ll s[11];
ll h[11]={0,2,6,4,8,6,10,14};//处理 时间 
ll a[101][101];
int main()
{
    memset(a,127/3,sizeof(a));
    for(re ll i=1;i<=7;i++)
        s[i]=read(); 
    ll qx=read(),qy=read();
    n=read();
    //读入 
    for(re ll i=1;i<=n;i++)
    {
        ll x=read(),y=read(),z=read();
        if(s[z])
            a[x][y]=a[y][x]=h[z]/2;
        else
            a[x][y]=a[y][x]=h[z];//记下每种地形有无魔法石的时间 
        m=max(m,x);
        m=max(m,y);//n 是边数 n<=10000,所以可以开 m 保存有多少个点 
    }
    for(re ll k=1;k<=m;k++)
    for(re ll i=1;i<=m;i++)
    for(re ll j=1;j<=m;j++)//Floyd 
    {
        if(a[i][k]+a[k][j]<a[i][j])
            a[i][j]=a[i][k]+a[k][j];
    }
    if(qx==qy)//如果起点和终点在同一位置,就不用走 
        puts("0");
    else
        printf("%lld
",a[qx][qy]);//输出最短距离
    //return 0; 
}
原文地址:https://www.cnblogs.com/wzx-RS-STHN/p/13522026.html