//============================================================================
// Name : 297.cpp
// Author : wly
// Version :
// Copyright : 最小环问题
// Description : 无向图最小环,floyd
//============================================================================
#include <iostream>
#include <cstdlib>
#include <cstdio>
#define MAX_N 305
#define INF 1<<29
using namespace std;
int n, g[MAX_N][MAX_N], dis[MAX_N][MAX_N];
int minCircuit() {
int ans = INF;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
dis[i][j] = g[i][j] == 0 ? INF : g[i][j];
//floyd计算最短路径
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= k; i++)
for (int j = i + 1; j <= k; j++)
if (g[i][k] && g[k][j])//从k点出发,回到k点
//最小环,i点到j点的最短路径+i点到k点的长度+k点到j点的长度
ans = min(dis[i][j] + g[i][k] + g[k][j], ans);
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]);
}
return ans;
}
int main() {
int m;
while (~scanf("%d%d", &n, &m)) {
memset(g, 0, sizeof(g));
for (int i = 0; i < m; i++) {
int _fn, _sn, _dis;
scanf("%d%d%d", &_fn, &_sn, &_dis);
g[_fn][_sn] = g[_sn][_fn] = _dis;
}
int ans = minCircuit();
printf("%d\n", (ans > 10000000) ? -1 : ans);
}
return 0;
}
BOJ 297 最小环问题 无向图最小环,floyd
最新推荐文章于 2022-10-26 22:43:51 发布