1. 程式人生 > >Bessie Come Home 回家(最短路)

Bessie Come Home 回家(最短路)

多個 在外 解題思路 速度 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 回家(最短路)