浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)

文章目录

  • 并查集知识
  • 畅通工程
    • 实现代码
    • 样例运行结果

并查集知识

浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第1张图片
浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第2张图片
浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第3张图片
浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第4张图片
浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第5张图片
浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第6张图片
浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第7张图片
浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第8张图片
浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第9张图片
浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第10张图片

畅通工程

题目原地址

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第11张图片
输入样例:

4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0

输出样例

1
0
2
998

实现代码

#include
#define N 1010
int father[N];

int Find(int x) {
	if(x != father[x]) {
		father[x] = Find(father[x]);
	}
	return father[x];
}

void Union(int x, int y) {
	int a = Find(x);
	int b = Find(y);
	if(a != b) {
		father[a] = b;
	}
}

int main() {
	while(1) {
		// n为城镇数, m为道路数
		int n, m;
		int ans = 0;
		scanf("%d", &n);
		if(n == 0) {
			break;
		}
		scanf("%d", &m);
		int i;
		for(i = 1; i <= n; i++) {
			father[i] = i;
		}
		int x, y;
		for(i = 0; i < m; i++) {
			scanf("%d %d", &x, &y);
			Union(x, y);
		}
		for(i = 1; i <= n; i++) {
			if(i == Find(i)) {
				ans++;
			}
		}
		printf("%d\n", ans - 1);
	}
	return 0;
}

样例运行结果

浙大计算机研究生复试上机考试-2005年畅通工程(考察并查集)_第12张图片
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

你可能感兴趣的:(每日刷题————其他算法竞赛题,开发语言,c语言,经验分享,算法,并查集)