poj 1734 Sightseeing trip

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;

}

  

你可能感兴趣的:(poj)