洛谷 P1529 回家 Bessie Come Home
题意
题目就是最短路的模型,求的是离‘Z’牧场最近的有牛的牧场的字母标号(就是牧场的名字)以及这座牧场到‘Z’距离
做法
要换位思考,将起始点设为‘Z’,一个个向外更新,可以将所有字母用一个自己写的ID函数将其化为序号,再读入距离时因为有多条路线,而我们要用的只有最短的那条,要min取最小的存入数组,其余可以舍去,用最短路模拟全部后,数组中存的就是标号为i的牧场到‘Z’牧场的距离,最后取最小值的时候,因为只有大写字母的牧场有牛,所以要将小写字母的牧场舍去后,for一遍即可
代码
#include<bits/stdc++.h> using namespace std; int f[55][55],d[55],v[55]; int id(char q) { if(q<='Z') return q-'A'+1; return q-'a'+1+26; } int main() { //freopen("comehome.in","r",stdin); //freopen("comehome.out","w",stdout); int n; scanf("%d",&n); for(int i=1;i<=n;++i) { char a,b; int s; scanf(" %c %c%d",&a,&b,&s); int x=id(a); int y=id(b); f[x][y]=(f[x][y]?min(f[x][y],s):s); f[y][x]=f[x][y]; } for(int i=1;i<=52;++i) d[i]=1e9; d[26]=0; for(int i=1;i<52;++i) { int ok=-1; for(int j=1;j<=52;++j) if(!v[j]&&(ok==-1||d[j]<d[ok])) ok=j; v[ok]=1; for(int j=1;j<=52;++j) if(f[ok][j]) d[j]=min(d[j],d[ok]+f[ok][j]); } int ans=1e9; char p; for(int i=1;i<26;++i) { if(ans>d[i]) { ans=d[i]; p=i+'A'-1; } } printf("%c %d\n",p,ans); return 0; }

浙公网安备 33010602011771号