最小环模板题
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#define int long long
using namespace std;
const int inf = 1e8;
int dis[109][109];
int mp[109][109];
int n, m,res;
void floyd() {
res = inf;
for (int k = 1; k <= n; k++) {
for (int i = 1; i < k; i++) {
for (int j = i+1; j < k; j++) {
res = min(res, dis[i][j] + mp[i][k] + mp[k][j]);
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <=n; j++) {
dis[i][j] =dis[j][i]= min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
}
signed main()
{
while (~scanf("%lld %lld", &n, &m)) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dis[i][j] = i == j ? 0 : inf;
mp[i][j] = dis[i][j];
}
}
int u, v, w;
for (int i = 1; i <= m; i++) {
scanf("%lld%lld%lld", &u, &v, &w);
mp[u][v] = mp[v][u] = dis[u][v] = dis[v][u] = min(w, mp[u][v]);
}
floyd();
if (res == inf)printf("It's impossible.\n");
else
printf("%lld\n", res);
}
return 0;
}