Bessie Come Home 回家(最短路)
阿新 • • 發佈:2018-09-09
多個 在外 解題思路 速度 span 完全 所有 char []
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\n",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\n",ans1,ans); 93 return 0; 94 }
Bessie Come Home 回家(最短路)