您的位置:首页 > 其它

【求最小代价环floyd】POJ 1734

2012-02-10 15:17 288 查看
#define N 110
int g

;
int dis

;
int ans
;
int p

;//记录i——j之间的路径
int n,m;
int minm;
int cnt;
int mid;
void floyd(){
int i,j,k;
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[j][k]<minm){
minm = dis[i][j]+g[i][k]+g[j][k];
cnt = 0;
mid = j;
while(mid != i){
ans[cnt++] = mid;
mid = p[i][mid];
}
ans[cnt++] = i;
ans[cnt++] = k;
}
}
}
//求最短路
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(dis[i][k]+dis[k][j]<dis[i][j]){
dis[i][j] = dis[i][k]+dis[k][j];
p[i][j] = p[k][j];
}
}
}
}
}

int main(){
while(scanf("%d%d",&n,&m) != -1){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
g[i][j] = MAX;
dis[i][j] = MAX;
p[i][j] = i;
}
g[i][i] = dis[i][i] = 0;
}
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(c < g[a][b]){
g[a][b] = g[b][a] = c;
dis[a][b] = dis[b][a] = c;
}
}
minm = MAX;
floyd();
if(minm == MAX)puts("No solution.");
else {
for(i=0;i<cnt;i++)
puts("");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: