hdu acm 1599 无向图最小环
一、问题描述
给出一个无向图,找出其中的最小环
二、方法
类似Floyd算法,在求最短路的情况下,计算最小费用,即最小环。方法就是在使用Floyd算法松弛计算第k个点之前,对于已经更新好的点(i,j<k)暴力搜索一遍,有的话就更新。
三、举例
http://acm.hdu.edu.cn/showproblem.php?pid=1599
四、代码
注:使用时可以将所有的宏定义去掉!
#define MAIN
//#define USEFILE
#include<stdio.h>
#include<iostream>
using namespace std;
#define N 120
#ifdef MAIN
int main() {
#else
int mincircle() {
#endif
#ifdef USEFILE
freopen("data.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int map[N][N];
int dis[N][N];
int m, n, inf = 100000000;
int a, b, c;
while (scanf("%d%d", &n, &m) != -1) {
for (int i = 0;i < n;i++) {
for (int j = 0;j < n;j++) {
dis[i][j] = map[i][j] = inf;
}
dis[i][i]=map[i][i] = 0;
}
for (int i = 0;i < m;i++) {
scanf("%d%d%d", &a, &b, &c);
a--;
b--;
map[a][b] = map[a][b] < c ? map[a][b] : c;
dis[a][b] = dis[b][a] = map[b][a] = map[a][b];
}
int ans = inf;
int temp;
for (int k = 0;k < n;k++) {
for (int i = 0;i < k;i++) {
for (int j = i + 1;j < k;j++) {
temp = dis[i][j] + map[i][k] + map[k][j];
ans = ans < temp ? ans : temp;
}
}
for (int i = 0;i < n;i++) {
for (int j = 0;j < n;j++) {
temp = dis[i][k] + dis[k][j];
dis[i][j] = dis[i][j] < temp ? dis[i][j] : temp;
}
}
}
if (ans >= inf) {
printf("It's impossible.\n");
}
else {
printf("%d\n", ans);
}
}
return 0;
}

浙公网安备 33010602011771号