您的位置:首页 > 其它

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

2012-05-08 23:37 393 查看
对于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

,g

,p

;
int n,m,min,cnt,ans
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: