题解 P1529 【回家 Bessie Come Home】

ShineEternal

2019-07-03 10:30:15

Solution

### 吐槽区: ~~我就想知道能不能仔细看看数据范围啊~~ ---- 进入正题: 本题显然就是个裸的最短路模板题,适用于**所有**算法。 和其他此类题目不同的是,本题没有直接在输入中给出牧场数的范围,但仔细想想字母, **大小写加起来一共才56个** 这就意味着可以Floyd 我们可以把读入的字母都转换成1~56,甚至懒一些(比如我),直接把字母的ASCII码搬过来也能$O(n^3)$ > code: ```cpp #include<cstdio> #include<cstring> #include<iostream> using namespace std; int f[505][505]; int main() { int m; scanf("%d",&m); char c1,c2; int z; for(int i=1;i<=500;i++) { for(int j=1;j<=500;j++) { f[i][j]=1000000000; } } int maxn=0; for(int i=1;i<=m;i++) { cin>>c1>>c2>>z; int tmp1=c1,tmp2=c2; f[tmp2][tmp1]=f[tmp1][tmp2]=min(f[tmp1][tmp2],z); maxn=max(maxn,max(tmp1,tmp2)); } for(int k=1;k<=maxn;k++) { for(int i=1;i<=maxn;i++) { for(int j=1;j<=maxn;j++) { //if(j!=i&&j!=k&&i!=j) f[i][j]=min(f[i][j],f[i][k]+f[k][j]); } } } char tag; int ans=2147483647; for(char i='A';i<='Y';i++) { int j=i; if(f[j][90]<ans) { ans=f[j][90]; tag=i; } } printf("%c %d\n",tag,ans); return 0; } ``` 撒花~