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;
}

  

posted on 2012-08-18 20:21  夜->  阅读(170)  评论(0编辑  收藏  举报