zoukankan      html  css  js  c++  java
  • USACO 2.4.4 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 }
    
    
    
     


  • 相关阅读:
    Longest Common Substring($LCS$)
    for in 和 for of的区别详解
    reduce的使用
    终于搞懂了vue 的 render 函数(一) -_-|||
    【Vue高级知识】细谈Vue 中三要素(响应式+模板+render函数)
    MVVM 和 VUE三要素:响应式、模板引擎、渲染
    node.js中的url.parse方法使用说明
    Chrome的cookie放在哪里了,Cookie/Session机制详解
    什么是PWA
    几张图让你看懂WebAssembly
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/9612628.html
Copyright © 2011-2022 走看看