最小环见 点击打开链接
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int inf = 1 << 28;
const int N = 105;
int a[N][N];
int dis[N][N];
int n, m;
int ans;
void init()
{
for( int i = 1; i <= n; i++ )
{
for( int j = 1; j <= n; j++ )
{
dis[i][j] = dis[j][i] = a[i][j] = (i == j? 0: inf);
}
}
}
void floyd()
{
ans = inf;
for( int k = 1; k <= n; k ++)
{
for( int i = 1; i < k; i++ )
{
for( int j = 1+i; j < k; j++ )
ans = min(ans, a[k][i] + dis[i][j] + a[j][k]);
}
for( int i = 1; i <= n; i++ )
{
for( int j = 1; j <= n; j++ )
{
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
init();
int u, v, w;
for( int i = 1; i <= m; i++ )
{
scanf("%d%d%d", &u, &v, &w);
dis[u][v] = dis[v][u] = a[u][v] = a[v][u] = min(w, a[u][v]);
}
floyd();
if( ans >= inf )
puts("It's impossible.");
else
printf("%d\n", ans);
}
return 0;
}