pku1734 Sightseeing trip(求无向图的最小环)
和hdu1599 find the mincost route 差不多
#include <stdio.h>
#define MAXN 105
#define INF 999999
int idx,ans,N,M,g[MAXN][MAXN],dist[MAXN][MAXN],post[MAXN][MAXN],path[MAXN];
void init()
{
int i,j,len;
ans=INF;
for(i=1; i<=N; i++)
for(j=1; j<=N; j++)
{
dist[i][j]=g[i][j]=INF;
post[i][j]=j;
}
while(M--)
{
scanf("%d %d %d",&i,&j,&len);
if(g[i][j] > len)
{
g[j][i]=g[i][j]=len;
dist[i][j]=dist[j][i]=g[i][j];
}
}
}
void floyd()
{
int i,j,k;
for(k=1; k<=N; k++)
{
for(i=1; i<k; i++)
{
for(j=1; j<i; j++)
{
if(ans > g[i][k]+g[k][j]+dist[i][j])
{
ans = g[i][k]+g[k][j]+dist[i][j];
idx=0;
int t=i;
path[idx++]=t;
while(post[t][j]!=j)
{
path[idx++]=post[t][j];
t=post[t][j];
}
path[idx++]=j;
path[idx++]=k;
}
}
}
for(i=1; i<=N; i++)
{
for(j=1; j<=N; j++)
{
if(dist[i][j] > dist[i][k] + dist[k][j])
{
dist[i][j] = dist[i][k] + dist[k][j] ;
post[i][j]=post[i][k];
}
}
}
}
}
int main()
{
while(scanf("%d %d",&N,&M)!=EOF)
{
init();
floyd();
if(ans==INF) printf("No solution.\n");
else
{
for(int i=0; i<idx; i++)
{
if(!i) printf("%d",path[i]);
else printf(" %d",path[i]);
}
printf("\n");
}
}
return 0;
}