UVA - 1395 Slim Span(最小生成树最大边权和最小边权之差最小)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41567

求使得生成树的最大边权与最小边权之差最小,枚举最小边生成最小生成树,求得答案。

这么做的正确性看这个链接 http://blog.csdn.net/sdj222555/article/details/7698978

#include
#include
#include
#include
using namespace std;

const int mnx = 110;
const int mxe = mnx*(mnx - 1) / 2;

struct edge
{
	int u, v, c;
	bool operator < (edge& b)const
	{
		return c < b.c;
	}
}e[mxe];

int fa[mnx];
int n, m;

int find(int t)
{
	if (fa[t] != t) fa[t] = find(fa[t]);
	return fa[t];
}

int kruskal()
{
	sort(e + 1, e + m + 1);
	int ret = 100000;
	for (int k = 1; k <= m; k++)
	{
		for (int i = 1; i <= n; i++)
			fa[i] = i;
		int min = 0, max = -100000;
		min = e[k].c;
		int t = 0;
		for (int i = k; i <= m; i++)
		{
			int u = e[i].u, v = e[i].v, c = e[i].c;
			u = find(u), v = find(v);
			if (u != v)
			{
				fa[u] = v;
				if (e[i].c > max) max = e[i].c;
				t++;
			}
		}
		if (t == n - 1)
		{
			if (max - min < ret) ret = max - min;
		}
	}
	return ret;
}

int main()
{
	while (scanf("%d%d", &n, &m) != EOF && n)
	{
		for (int i = 1; i <= m; i++)
		{
			scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].c);
		}

		int ans = kruskal();

		printf("%d\n", ans==100000?-1:ans);
	}
}


你可能感兴趣的:(数据结构,图论)