poj 1734 Sightseeing trip(floyd 拓展 求最小环)

对于floyd 拓展为什么可以判断 出最小环还是不是太理解

苟且 先贴下模版吧

感谢:心_随_梦_翔 的分析

http://hi.baidu.com/%D0%C4_%CB%E6_%C3%CE_%CF%E8/blog/item/403b9c58699c7642d0090675.html

感谢 我们一直在努力  的代码

http://www.cnblogs.com/zhaoguanqin/archive/2012/05/08/2490121.html

今天也够是郁闷的inf 开到 9 个 9  而中间 加法 导致溢出了 各种WA ,又找了一万晚上的错误

 

#include<stdio.h>

#define N 110

#define inf 9999999

int dist[N][N],g[N][N],p[N][N];

int n,m,min,cnt,ans[N];



void floyd()

{

    for(int k=1;k<=n;k++)

    {

        for(int i=1;i<k;i++)

        {

            for(int j=1;j<i;j++)

            {

                if(dist[i][j]+g[i][k]+g[k][j]<min)

                {

                    min=dist[i][j]+g[i][k]+g[k][j];

                    int mid=j;cnt=0;

                    while(mid!=i)

                    {

                        ans[cnt++]=mid;

                        mid=p[i][mid];

                    }

                    ans[cnt++]=i;

                    ans[cnt++]=k;

                }



            }

        }

        for(int i=1;i<=n;i++)

        for(int j=1;j<=n;j++)

        {

            if(dist[i][j]>dist[i][k]+dist[k][j])

            {

                dist[i][j]=dist[i][k]+dist[k][j];

                p[i][j]=p[k][j];

            }

        }

    }

}



int main()

{

    scanf("%d%d",&n,&m);

    for(int i=1;i<=n;i++)

      for(int j=1;j<=n;j++)

      {

          dist[i][j]=inf;

          g[i][j]=inf;

          p[i][j]=i;

          if(i==j) dist[i][i]=0,g[i][i]=0;



      }

    while(m--)

    {

        int u,v,c;scanf("%d%d%d",&u,&v,&c);

        if(c<g[u][v])

        {

            g[u][v]=g[v][u]=c;

            dist[u][v]=dist[v][u]=c;

        }

    }

    min=inf;

    floyd();

    if(min==inf) puts("No solution.");

    else

    {

        printf("%d",ans[0]);

        for(int i=1;i<cnt;i++)

        printf(" %d",ans[i]);

        printf("\n");

    }

    return 0;

}

你可能感兴趣的:(floyd)