HDU 1301(Jungle Roads)

计算最小生成树的总长度,使用 Kruskal算法

#include <iostream>
#include <algorithm>
using namespace std;
const int MAXR = 80;

int father[100]; //父结点

struct road //公路
{
	int start; //起点
	int end; //终点
	int dis; //距离
}r[MAXR];

//排序条件
bool cmp(road r1, road r2)
{
	return r1.dis < r2.dis;
}

//初始化并查集
void makeSet(int n)
{
	for (int i = 'A'; i < 'A' + n; i++)
	{
		father[i] = i;
	}
}

//查找x所在集合的代表元素(所在树的根结点)
int find(int x)
{
	if (x != father[x])
		father[x] = find(father[x]);
	return father[x];
}

int main()
{
	int n;
	while (cin >> n)
	{
		if (n == 0)
			break;

		makeSet(n);

		char s, e; //起点,终点
		int d; //距离
		int k; //当前结点道路数量
		int index = 0; //总路径数
		for (int i = 1; i < n; i++) //将所有路径存入结构体数组
		{
			cin >> s >> k;
			for (int j = 0; j < k; j++)
			{
				cin >> e >> d;
				r[index].start = s;
				r[index].end = e;
				r[index].dis = d;
				++index;
			}
		}

		sort(r, r + index, cmp);

		int sum = 0; //总距离
		for (int i = 0; i < index; i++)
		{
			int fx = find(r[i].start);
			int fy = find(r[i].end);
			if (fx != fy)
			{
				father[fx] = fy;
				sum += r[i].dis;
			}
		}
		cout << sum << endl;
	}
	return 0;
}

继续加油。

上一篇:抽象类,多态和接口


下一篇:【ybt金牌导航5-3-1】【luogu P3233】世界树 / 虚树例题