当前位置: 代码迷 >> 综合 >> poj 1734 Sightseeing trip 扩展floyd求最小环
  详细解决方案

poj 1734 Sightseeing trip 扩展floyd求最小环

热度:53   发布时间:2024-01-19 06:23:45.0

题意:

有一个无向图内的最小环。

思路:

求最小环的模板题。

代码:

#include<iostream>
using namespace std;
const int maxN=128;
int g[maxN][maxN];
int directConnect[maxN][maxN];
int passPoint[maxN][maxN];
int path[maxN];
int ans;
int n,m,cnt;void findPath(int i,int j)
{if(passPoint[i][j]==-1){path[cnt++]=j;return ;}int interPoint=passPoint[i][j];findPath(i,interPoint);findPath(interPoint,j);return ;
}int main()
{memset(g,-1,sizeof(g));	memset(passPoint,-1,sizeof(passPoint));memset(directConnect,-1,sizeof(directConnect));scanf("%d%d",&n,&m);while(m--){int a,b,c;scanf("%d%d%d",&a,&b,&c);if(g[a][b]==-1||g[a][b]>c){g[a][b]=g[b][a]=c;directConnect[a][b]=c;directConnect[b][a]=c;}}int i,j,k;ans=INT_MAX;for(k=1;k<=n;++k){for(i=1;i<=n;++i)for(j=1;j<=n;++j)if(i!=k&&i!=j&&j!=k)if(directConnect[i][k]!=-1&&directConnect[k][j]!=-1&&g[i][j]!=-1)if(ans>directConnect[i][k]+directConnect[k][j]+g[i][j]){ans=directConnect[i][k]+directConnect[k][j]+g[i][j];cnt=0;path[cnt++]=i;findPath(i,j);path[cnt++]=k;}			for(i=1;i<=n;++i)for(j=1;j<=n;++j)if(i!=k&&i!=j&&j!=k)if(g[i][k]!=-1&&g[k][j]!=-1)if(g[i][j]==-1||g[i][k]+g[k][j]<g[i][j]){g[i][j]=g[i][k]+g[k][j];passPoint[i][j]=k;}						}if(ans==INT_MAX)printf("No solution.");elsefor(i=0;i<cnt;++i)printf("%d%c",path[i],i==cnt-1?'\n':' ');return 0;	
}