1734

/*
floyd求最小环。

在floyd算法的基础上,我们知道第k次循环,就是求i到j经过编号1~k之间顶点的最小距离。
所以可以在第k次循环的时候,利用k-1次循环的信息,找到一个最小解。k次循环完成,就找到了全局的最下
解
*/

// include file
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <ctime>

#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <bitset>

#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <functional>

using namespace std;

// typedef
typedef long long ll;

// 
#define read freopen("in.txt","r",stdin)
#define write freopen("out.txt","w",stdout)

const double Pi = acos(-1.0);
const double eps = 1e-6;
const int IntMAX = 0x7fffffff;
const double DoubleMAX = 1e307;

#define TMIN(x,y) ( x<y?x:y )
////////////////////////
//#define DEBUG
const int Inf = 5000001;

int dp[110][110];
int mp[110][110];
int path[110][110];
int stk[110],top;
int N,M;

void dfs(int l,int r)
{
	int k = path[l][r];
	if( k==-1 )
	{
		stk[top++] = r;
		return;
	}
	dfs(l,k);
	dfs(k,r);
}

int main()
{
#ifdef DEBUG
	read;
	write;
#endif
	int a,b,c;
	while(scanf("%d %d",&N,&M)==2)
	{
		for(int i=1;i<=N;i++)
		{
			for(int j=1;j<=N;j++)
			{
				mp[i][j] = (i==j?0:Inf);
			}
		}

		for(int i=0;i<M;i++)
		{
			scanf("%d %d %d",&a,&b,&c);
			mp[a][b] = mp[b][a] = min(mp[a][b],c);
		}

		for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)
		{
			dp[i][j] = mp[i][j];
			path[i][j] = -1;
		}

		int ans = Inf;
		for(int k=1;k<=N;k++)
		{
			for(int i=1;i<k;i++)
			{
				for(int j=i+1;j<k;j++)
				{
					if( dp[i][j]+mp[i][k]+mp[k][j]<ans)
					{
						ans=  dp[i][j]+mp[i][k]+mp[k][j];
						top = 0;
						stk[top++] = i;
						dfs(i,j);//必须按照pass顺序
						stk[top++] = k;
					}
				}
			}

			for(int i=1;i<=N;i++)
			{
				for(int j=1;j<=N;j++)
				{
					if( dp[i][j]>dp[i][k]+dp[k][j])
					{
						dp[i][j] = dp[i][k]+dp[k][j];
						path[i][j] = k;
					}
				}
			}
		}

		//
		if( ans==Inf )
		{
			printf("No solution.\n");
		}
		else
		{
			for(int i=0;i<top;i++)
			{
				i==0?printf("%d",stk[i]):printf(" %d",stk[i]);
			}
			printf("\n");
		}
	}
	return 0;
}

posted @ 2011-06-12 14:33  AC2012  阅读(147)  评论(0编辑  收藏  举报