How Many Maos Does the Guanxi Worth

HDU - 5137 

代码写的很乱很乱

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<string>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 
 9 const int INF=0x3f3f3f3f;
10 int n,m;
11 int e[1005][1005];
12 int dis[1005];
13 bool vis[1005];
14 int ee[1005];
15 
16 void init()
17 {
18     for(int i=1;i<=n;i++)
19         for(int j=1;j<=n;j++)
20             if(i==j) e[i][j]=0;
21             else e[i][j]=e[j][i]=INF;
22     for(int i=1;i<=n;i++)
23         dis[i]=INF;
24     dis[1]=0;
25 }
26 
27 void di()
28 {
29     for(int i=1;i<=n;i++)
30         dis[i]=e[1][i];
31     dis[1]=0;
32     for(int i=1;i<=n-1;i++)
33     {
34         int u;
35         int minn=INF;
36         for(int j=1;j<=n;j++)
37         {
38             if(!vis[j] && dis[j]<minn)
39             {
40                 u=j;
41                 minn=dis[j];
42             }
43         }
44         
45         vis[u]=1;
46         for(int j=1;j<=n;j++)
47         {
48             if(!vis[j] && dis[j]>dis[u]+e[u][j])
49                 dis[j]=dis[u]+e[u][j];
50         }
51     }
52 }
53 
54 int main()
55 {
56     while(scanf("%d%d",&n,&m)==2)
57     {
58         if(m==0&&n==0)
59             break;
60             
61         init();
62         int maxn=0;
63         int x,y,z;
64         for(int i=1;i<=m;i++)
65         {
66             scanf("%d%d%d",&x,&y,&z);
67             e[x][y]=e[y][x]=z;
68         }
69         
70         for(int k=2;k<n;k++) //头和尾不能 
71         {
72             for(int i=1;i<=n;i++) 
73             {
74                 ee[i]=e[k][i];
75                 e[k][i]=e[i][k]=INF; //断掉某一条路 
76             }
77             memset(vis,0,sizeof(vis));
78             //memset后面不能再加 vis[1]=1; 这是错的 
79             di();
80             
81             if(maxn<dis[n])
82                 maxn=dis[n];
83             for(int i=1;i<=n;i++)//还原 
84             {
85                 e[k][i]=e[i][k]=ee[i];
86             }
87         }
88         if(maxn==INF)
89             printf("Inf
");
90         else
91             printf("%d
",maxn);
92     }
93 }
原文地址:https://www.cnblogs.com/thunder-110/p/9141659.html