题解 | #继续畅通工程#

继续畅通工程

https://www.nowcoder.com/practice/16212f7d46e44174b5505997ea998538

//土尔逊Torson 编写于2023/07/05
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAXN = 100;

struct Edge13501 {
	int from;       //边的起点
	int to;         //边的终点
	int length;     //边的长度
	bool operator<(const Edge13501& e) const {
		return length < e.length;
	}
};

Edge13501 edge13501[MAXN * MAXN];   //边集
int father13501[MAXN];              //父亲结点
int height13501[MAXN];              //结点高度

void Initial13501(int n) {     //初始化
	for (int i = 0; i <= n; i++) {
		father13501[i] = i;
		height13501[i] = 0;
	}
}

int Find13501(int x) {         //查找根结点
	if (x != father13501[x]) {
		father13501[x] = Find13501(father13501[x]);
	}
	return father13501[x];
}

void Union13501(int x, int y) { //合并集合
	x = Find13501(x);
	y = Find13501(y);
	if (x != y) {
		if (height13501[x] < height13501[y]) {
			father13501[x] = y;
		}
		else if (height13501[y] < height13501[x]) {
			father13501[y] = x;
		}
		else {
			father13501[y] = x;
			height13501[x]++;
		}
	}
	return;
}

int Kruskal13501(int n, int edgeNumber) {
	Initial13501(n);
	sort(edge13501, edge13501 + edgeNumber);    //按权值排序
	int sum = 0;
	for (int i = 0; i < edgeNumber; ++i) {
		Edge13501 current = edge13501[i];
		if (Find13501(current.from) != Find13501(current.to)) {
			Union13501(current.from, current.to);
			sum += current.length;
		}
	}
	return sum;
}

int main() {
	int n;
	while (scanf("%d", &n) != EOF) {
		if (n == 0) {
			break;
		}
		int edgeNumber = n*(n - 1) / 2;
		for (int i = 0; i < edgeNumber; ++i) {
			int status;
			scanf("%d%d%d%d", &edge13501[i].from, &edge13501[i].to,
				&edge13501[i].length, &status);
			if (status == 1) {
				edge13501[i].length = 0;
			}
		}
		int answer = Kruskal13501(n, edgeNumber);
		printf("%d\n", answer);
	}
	system("pause");
	return EXIT_SUCCESS;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

xxxxOxo:该催就催,想要你的不会因为催就挂,催了就挂的是因为本来就要挂你
点赞 评论 收藏
分享
爱吃肉的伊登在写日记:好棒,27届简历能做成这个样子,但是第一个项目感觉cover住难度还是不小的,特别是二面的时候肯定要对分布式系统设计这一块儿有高出正常面试者的水平才行
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务