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 回家 Bessie Come Home

洛谷——P1529 回家 Bessie Come Home

洛谷 P1529 回家 Bessie Come Home

P1529 [USACO2.4]回家 Bessie Come Home

luogu P1529 回家 Bessie Come Home

usaco题目分享——Bessie Come Home