其他分享
首页 > 其他分享> > HDU 1301(Jungle Roads)

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

继续加油。

标签:index,HDU,1301,int,father,++,Roads,find,dis
来源: https://blog.csdn.net/Intelligence1028/article/details/104893063