原题
http://acm.hdu.edu.cn/showproblem.php?pid=1599
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 9999999//开始的时候是999999999就一直wa。。。
#define arr 105
int n,m,dis[arr][arr];//dis[][]保存可以到达的最短距离,会变化
int g[arr][arr];//g[][]保存图的信息,不做变化
void Floyd(){
int i,j,k,ans=maxn;
//for(i=1;i<=n;i++){
// for(j=1;j<=n;j++){
// dis[i][j] = g[i][j];
// }
//}
for(k=1;k<=n;k++){
for(i=1;i<=k;i++){
for(j=1;j<i;j++){
if(dis[i][j]+g[i][k]+g[k][j]<ans){
ans = dis[i][j]+g[i][k]+g[k][j];
}
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(dis[i][j] > dis[i][k]+dis[k][j]){
dis[i][j] = dis[i][k]+dis[k][j];
}//不断更新两点之间的最短距离
}
}
}
if(ans == maxn){
printf("It's impossible.\n");
}
else{
printf("%d\n",ans);
}
}
int main(){
int i,j,c;
while(~scanf("%d%d",&n,&m)){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
g[i][j] = maxn;
}
}
while(m--){
scanf("%d%d%d",&i,&j,&c);
if(c < g[i][j]){
g[i][j] = c;
g[j][i] = c;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
dis[i][j] = g[i][j];//初始化两点之间的最短距离
}
}
Floyd();
}
return 0;
}