\(Sol\)
\(Floyed\)求最小环板子题,具体见图论专题.
\(Code\)
#include<iostream>
#include<cstdio>
#include<vector>
#define il inline
#define Ri register int
#define go(i,a,b) for(Ri i=a;i<=b;++i)
#define yes(i,a,b) for(Ri i=a;i>=b;--i)
#define e(i,u) for(Ri i=b[u];i;i=a[i].nt)
#define ll long long
#define db double
#define inf 2147483647
using namespace std;
il int read()
{
Ri x=0,y=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*y;
}
const int N=1010;
int n,m,rem[N][N],b[N],ct;ll a[N][N],f[N][N],as=1LL*inf*1000000;
il void sol(Ri l,Ri r)
{
if(rem[l][r]==-1)return;
sol(l,rem[l][r]);
b[++ct]=rem[l][r];
sol(rem[l][r],r);
}
int main()
{
n=read(),m=read();
go(i,1,n)go(j,1,n)a[i][j]=f[i][j]=as,rem[i][j]=-1;
go(i,1,m)
{
Ri u=read(),v=read(),w=read();
a[u][v]=a[v][u]=f[u][v]=f[v][u]=min(a[u][v],(ll)w);
}
go(k,1,n)
{
go(i,1,k-1)
go(j,i+1,k-1)
{
if((f[i][j]+a[j][k]+a[k][i])<as)
{
as=f[i][j]+a[j][k]+a[k][i];
ct=0;
sol(i,j);
b[++ct]=j;b[++ct]=k;b[++ct]=i;
}
}
go(i,1,n)
go(j,1,n)
if(f[i][k]+f[k][j]<f[i][j])
f[i][j]=f[i][k]+f[k][j],rem[i][j]=k;
}
if(as==1LL*inf*1000000){printf("No solution.\n");return 0;}
go(i,1,ct){printf("%d ",b[i]);}printf("\n");
return 0;
}