How Many Maos Does the Guanxi Worth
代码写的很乱很乱
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\n"); 90 else 91 printf("%d\n",maxn); 92 } 93 }