题意可以理解为求有至少带3个节点的环的最小值。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define INF 100001
int map[102][102],dis[102][102],num[102];
int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
int n,m,s,e,cost,ans;
int i,j,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(num,0,sizeof(num));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=INF;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&s,&e,&cost);
if(map[s][e]>cost)
map[s][e]=map[e][s]=cost;
}
ans=INF;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dis[i][j]=map[i][j];
for(k=1;k<=n;k++)
{
for(i=1;i<=k;i++)
{
for(j=1;j<i;j++)
{
ans= min(ans,dis[i][j]+map[i][k]+map[k][j]);
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
if(ans==INF)
cout<<"It's impossible."<<endl;
else
cout<<ans<<endl;
}
return 0;
}