USACO-Bessie Come Home
来源:http://ace.delos.com/usacoprob2?a=aazEDPQYeki&S=comehome
图论水题
主要注意下题目的条件就行了。
注意a和A可以同时出现,因为边数最大是10000,所以边必有重复给出的。
其他的没什么特别的,dijkstra模板秒杀
/* ID:ay27272 PROG:comehome LANG:C++ */ #include <cstring> #include <cstdio> #include <string> using namespace std; #define INF 168430090 #define NN 55 int map[NN][NN]; int d[NN]; bool f[NN]; int n; bool done[NN]; void dijkstra(int s) //dijkstra模板 { memset(d,10,sizeof(d)); memset(done,0,sizeof(done)); for (int i=1;i<NN;i++) if (f[i]) d[i]=map[s][i]; d[s]=0; done[s]=true; int minn,k; for (int i=1;i<NN;i++) { minn=INF; for (int j=1;j<NN;j++) if (!done[j] && d[j]<minn && f[j]) minn=d[k=j]; done[k]=true; for (int j=1;j<NN;j++) if (f[j] && d[j]>d[k]+map[k][j]) d[j]=d[k]+map[k][j]; } } char uppercase(char c) //没找到C++中的相应函数,只能自己写了 { if ('A'<=c && c<='Z') return c; else return (c-'a'+'A'); } int main() { freopen("comehome.in","r",stdin); freopen("comehome.out","w",stdout); memset(f,0,sizeof(f)); memset(map,10,sizeof(map)); char c1,c2; int u,v,dd; scanf("%d\n",&n); for (int i=1;i<=n;i++) { scanf("%c %c %d\n",&c1,&c2,&dd); //大写的存在1-26,小写存在27-52 if (islower(c1)) u=27+c1-'a'; else u=c1-'A'+1; if (islower(c2)) v=27+c2-'a'; else v=c2-'A'+1; f[u]=f[v]=true; map[u][v]=map[v][u]=min(map[u][v],dd); } dijkstra(26); int minn=INF,k; for (int i=1;i<26;i++) if (f[i] && d[i]<minn) minn=d[k=i]; printf("%c %d\n",k+'A'-1,minn); return 0; }