题目
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; }