
Untitled
By: a guest on
Apr 28th, 2012 | syntax:
C++ | size: 1.80 KB | hits: 19 | expires: Never
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#define get(i) scanf("%d",&i);
using namespace std;
const int maxn = 101;
int edge[maxn][maxn];
int parent[maxn];
bool used[maxn];
const int inf = 1<<30;
int n ,m;
int dijkstra(int from,int to)
{
int d[maxn],mind,mini;
for(int i= 0;i<=n;i++)
d[i]=(i==from)?0:inf;
memset(used,false,sizeof(used));
memset(parent,0,sizeof(parent));
for(int i = 1;i<=n;i++)
{
mind = inf;mini = 0;
for(int j = 1;j<=n;j++)
{
if(!used[j] && (mind>d[j]))
{
mind = d[j];mini = j;
}
}
if(mind == inf)return d[to];
used[mini]=true;
for(int j = 1;j<=n;j++)
{
if(!used[j] && d[j]>d[mini]+edge[mini][j])
{
d[j]=d[mini]+edge[mini][j];
parent[j]=mini;
}
}
}
return d[to];
}
int path[maxn];
int pathsize;
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int a,b,w;
cin>>n;
while(n!=-1)
{
cin>>m;
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
edge[i][j]=inf;
int ans = inf;
for(int i = 0;i<m;i++)
{
get(a);get(b);get(w);
if(edge[a][b]>w)
edge[a][b]=edge[b][a]=w;
for(int j = 1;j<=n;j++)
for(int k = j+1;k<=n;k++)
{
if(edge[j][k] == inf)continue;
int cur= edge[j][k];
edge[j][k]=edge[k][j] = inf;
int curans = cur+dijkstra(j,k);
if(ans>curans)
{
ans = curans;
pathsize = 0;
int r = k;
while(r)
{
path[pathsize++]=r;
r = parent[r];
}
}
edge[j][k]=edge[k][j] = cur;
}
}
if(ans == inf)
{
cout<<"No solution.\n";
}
else
{
for(int i = pathsize-1;i>=0;i--)
{
cout<<path[i];
if(i!=0)cout<<" ";
}
cout<<endl;
}
cin>>n;
}
return 0;
}