hdu 1874【畅通工程续】

在此郑重的向南柯小朋友表示我的感谢!!

如果不是他告诉我输入的时候需要处理

if(g[a][b] == -1 || g[a][b] > w)
    g[a][b] = g[b][a] = w;

(从一个点到另外一个点竟然有好几种选择,囧,我们仅仅需要考虑最小的就ok了)这个东西的话,相信我是找不出问题来的.......

也向他表示感谢HDU today这一题也是他找出了问题,就是起点和目的地相同的情况我没有考虑......

代码如下:
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int g[200][200];
 5 int vis[200];
 6 int d[200];
 7 int n,m;
 8 int start,end;
 9 
10 void dij()
11 {
12     memset(vis,0,sizeof(vis));
13     for(int i = 0;i < n;i ++)
14     {
15         d[i] = g[start][i];
16     }
17 
18     vis[start] = 1;
19     for(int i = 0;i < n;i ++)
20     {
21         int minn = -1;
22         int k = 0;
23         for(int j = 0;j < n;j ++)
24         {
25             if(!vis[j]&&d[j] != -1&&(minn == -1 || minn > d[j]))
26                 minn = d[k = j];
27         }
28 
29         if(minn == -1)
30             break;
31         vis[k] = 1;
32 
33         for(int j = 0;j < n;j ++)
34         {
35             if(!vis[j] &&g[k][j] != -1 && (d[j] == -1 || d[j] > d[k] + g[k][j]))
36             {
37                 d[j] = d[k] + g[k][j];
38             }
39         }
40     }
41 
42     printf("%d\n",d[end]);
43 }
44 
45 int main()
46 {
47     while(scanf("%d%d",&n,&m) == 2)
48     {
49         memset(g,-1,sizeof(g));
50         for(int i = 0;i < m;i ++)
51         {
52             int a,b,w;
53             scanf("%d%d%d",&a,&b,&w);
54             if(g[a][b] == -1 || g[a][b] > w)
55                 g[a][b] = g[b][a] = w;
56             g[a][a] = g[b][b] = 0;
57         }
58 
59         scanf("%d%d",&start,&end);
60         if(start == end)
61         {
62             printf("0\n");
63             continue;
64         }
65         dij();
66     }
67 
68     return 0;
69 }

我是喜欢用-1来表示不可达的,不太喜欢用一个大值,有时候出问题了就喜欢看是不是这个-1的问题,汗......转移了我找错的注意力......不过我还是用-1代替最大值,(*^__^*) 嘻嘻……

原文地址:https://www.cnblogs.com/Shirlies/p/2479435.html