http://vijos.org/p/1046
求个最小环,Floyd即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ms(i,j) memset(i, j, sizeof(i));
using namespace std;
int n,m;
int G[102][102];
int dis[102][102];
int main ()
{
while(scanf("%d%d", &n, &m)==2)
{
ms(G,27);
for (int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d", &a,&b,&c);
G[a][b]=G[b][a]=c;
}
memcpy(dis,G,sizeof(G));
int ans = 10000000;
for (int k=1;k<=n;k++)
{
for (int i=1;i<=k-1;i++)
for (int j=1;j<=k-1;j++)
ans = min(ans, dis[i][j]+G[j][k]+G[k][i]);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (k!=i&&k!=j&&i!=j)
dis[i][j] = min(dis[i][j], dis[i][k]+dis[k][j]);
}
if (ans==10000000) printf("No solution.\n");
else printf("%d\n", ans);
}
return 0;
}