http://poj.org/problem?id=1734
比着别人的代码写的 自己对floyd的理解还是不深刻呀
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#define LL long long
using namespace std;
const int N=105;
const int INF=0x0f3f3f3f;
int d[N][N];
int dist[N][N];
int f[N][N];
int path[N];
int main()
{
//freopen("data.txt","r",stdin);
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
d[i][j]=dist[i][j]=INF;
f[i][j]=i;
}
while(m--)
{
int i,j,x;
scanf("%d %d %d",&i,&j,&x);
d[i][j]=d[j][i]=dist[i][j]=dist[j][i]=min(d[i][j],x);
}
int MIN=INF;
int I;
for(int l=1;l<=n;++l)
{
for(int i=1;i<l;++i)//l 也可以换成n 还是不理解呀
{
for(int j=i+1;j<l;++j)//l 也可以换成n 还是不理解呀
{
int temp=dist[i][j]+d[i][l]+d[l][j];
if(temp<MIN)
{
MIN=temp;
I=0;
int k=j;
do{
path[I++]=k;
k=f[i][k];
}while(k!=i);
path[I++]=i;
path[I++]=l;
}
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(dist[i][l]+dist[l][j]<dist[i][j])
{
dist[i][j]=dist[i][l]+dist[l][j];
f[i][j]=f[l][j];
}
}
}
}
if(MIN==INF)
{
printf("No solution.\n");
continue;
}
for(int i=0;i<I;++i)
{
if(i)
printf(" ");
printf("%d",path[i]);
}
printf("\n");
}
return 0;
}
浙公网安备 33010602011771号