Bessie Come Home 回家(最短路)
Posted wkfvawl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bessie Come Home 回家(最短路)相关的知识,希望对你有一定的参考价值。
Description
现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只速度最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。 每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。 有时,两个牧场(可能是自我相同的)之间会有超过一条道路相连。 至少有一个牧场和谷仓之间有道路连接。 因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。 当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。 牧场被标记为‘a‘..‘z‘和‘A‘..‘Y‘,在用大写字母表示的牧场中有一只母牛,小写字母中则没有。 谷仓的标记是‘Z‘,注意没有母牛在谷仓中。
Input
第 1 行: 整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。 第 2 ..P+1行: 用空格分开的两个字母和一个整数: 被道路连接牧场的标记和道路的长度(1<=长度<=1000)。
Output
单独的一行包含二个项目: 最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。
Sample Input
5 A d 6 B d 3 C e 9 d Z 8 e Z 3
Sample Output
B 11
解题思路:最短路问题,因为牧场最多只有52个,可以看出多源最短路,使用Floyd算法;但同样的是终点只有一个,要求的是所有起点到终点中的
最短路,我们完全可以反其道而行之,看出单源最短路问题,将终点看出起点,使用Dijkstra算法,利用其中的dis[]数组,找到终点到起点各点中
距离最短的即可。
Floyd算法
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 const int INF =1e8; 6 using namespace std; 7 int n; 8 int flag[110]; 9 int maps[110][110]; 10 void Floyd() 11 { 12 int i,j,k; 13 for (k = ‘A‘; k <= ‘z‘; k++) 14 { 15 for (i = ‘A‘; i <= ‘z‘; i++) 16 { 17 for (j = ‘A‘; j <= ‘z‘; j++) 18 { 19 maps[i][j]=min(maps[i][j],maps[i][k]+maps[k][j]); 20 } 21 } 22 } 23 } 24 int main() 25 { 26 char a,b; 27 int c,i,j; 28 int ans = INF; 29 char ans1; 30 for (i=‘A‘;i<=‘z‘;i++) 31 { 32 for (j =‘A‘;j<=‘z‘;j++) 33 { 34 if (i!=j) 35 { 36 maps[i][j]=INF; 37 } 38 } 39 } 40 scanf("%d",&n); 41 getchar(); 42 for (i = 1; i <= n; i++) 43 { 44 45 scanf("%c %c",&a,&b); 46 scanf("%d",&c); 47 getchar(); 48 if (a >= ‘A‘ && a <= ‘Z‘) 49 { 50 flag[a] = 1; 51 } 52 if (b >= ‘A‘ && b <= ‘Z‘) 53 { 54 flag[b]=1; 55 } 56 maps[a][b]=maps[b][a]=min(c,maps[a][b]); 57 } 58 Floyd(); 59 for (i =‘A‘; i<=‘Y‘; i++) 60 { 61 if (flag[i]&&maps[i][‘Z‘]<ans) 62 { 63 ans = maps[i][‘Z‘]; 64 ans1 = char(i); 65 } 66 } 67 printf("%c %d ",ans1,ans); 68 return 0; 69 }
Dijkstra算法
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 const int INF =1e8; 6 using namespace std; 7 int n; 8 int vis[150]; 9 int flag[150]; 10 int dis[150]; 11 int maps[150][150]; 12 void Dijstra() 13 { 14 int i,j,pos=1,mins,sum=0; 15 for(i=‘A‘; i<=‘z‘; ++i) 16 { 17 dis[i]=maps[90][i]; 18 } 19 vis[90]=-1; 20 dis[90]=0; 21 for(i=‘A‘; i<‘z‘; i++) 22 { 23 mins=INF; 24 for(j=‘A‘; j<=‘z‘; ++j) 25 { 26 if(!vis[j]&&mins>dis[j]) 27 { 28 mins=dis[j]; 29 pos=j; 30 } 31 } 32 vis[pos]=-1; 33 for(j=‘A‘; j<=‘z‘; ++j) 34 { 35 if(!vis[j]&&dis[j]>dis[pos]+maps[pos][j]) 36 { 37 dis[j]=dis[pos]+maps[pos][j]; 38 } 39 } 40 } 41 return ; 42 } 43 int main() 44 { 45 char a,b; 46 int c,i,j; 47 int ans = INF; 48 char ans1; 49 memset(vis,-1,sizeof(vis)); 50 for (i=‘A‘; i<=‘z‘; i++) 51 { 52 for (j=‘A‘; j<=‘z‘; j++) 53 { 54 if(i!=j) 55 { 56 maps[i][j]=INF; 57 } 58 else 59 { 60 maps[i][i]=0; 61 } 62 } 63 } 64 scanf("%d",&n); 65 getchar(); 66 for (i = 1; i <= n; i++) 67 { 68 69 scanf("%c %c",&a,&b); 70 scanf("%d",&c); 71 getchar(); 72 for(j=‘A‘;j<=‘z‘;j++) 73 { 74 vis[a]=0; 75 } 76 for(j=‘A‘;j<=‘z‘;j++) 77 { 78 vis[b]=0; 79 } 80 maps[a][b]=maps[b][a]=min(c,maps[a][b]); 81 } 82 Dijstra(); 83 ans=INF; 84 for(i=‘A‘;i<=‘Y‘;i++) 85 { 86 if(dis[i]<ans) 87 { 88 ans=dis[i]; 89 ans1=i; 90 } 91 } 92 printf("%c %d ",ans1,ans); 93 return 0; 94 }
以上是关于Bessie Come Home 回家(最短路)的主要内容,如果未能解决你的问题,请参考以下文章
P1529 [USACO2.4]回家 Bessie Come Home