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;
}

  

posted @ 2016-01-27 18:03  冠king  阅读(115)  评论(0)    收藏  举报