并查集入门经典题:畅通工程

ACM杭电OJ裸并查集 A - 畅通工程 Problem: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?  Input: 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( 注意:两个城市之间可以有多条道路相通,也就 阅读详情
Problem Description
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。 
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。 
 

Output
对每个测试用例,在1行里输出最少还需要建设的道路数目。 
 

Sample Input
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
 

Sample Output
1 0 2 998

思路:

先简要说一下并查集:

首先我们定义一个一维的整型数组pre,pre[x] = r 表示x节点的上一级节点是r

再定义两个方法:

一个是find,用途是寻找一个节点的根节点

一个是join,用途是将一个节点(包括他的子节点加入另一个节点)

形象的图来表示


上图中 pre[c] = A


join(B,A)  就会把两张图关系变成如上


再来看这两个方法的代码:我用的是java,其实用什么语言都是一样的

static int[] pre = new int[1000];
	
	static int find(int x){
		int r = x;
		while (pre[r] != r) {//因为根节点的上一级已经没有了,就是他自己,如果不是根节点就继续向上查找
			r = pre[r];
		}
		//此时r已经是根节点的值了
		return r;
	}
	
	//将x和y连通起来
	static void join(int x,int y){
		int a = find(x);
		int b = find(y);
		if (a != b) {
			pre[a] = b;
		}
	}

回到题目:

这题可以理解为,只要是能够互相连通的城市,都把它们用并查集join一下,然后就会分成很多组,能够互相连通的城市为一组,孤立的城市单独一组。最后统计出有几组,然后用组数-1就可以了。这个原理很清楚,两个点之间画一条线连接,三个点之间最少两条线连接。把能够连通的城市看成一个整体来算。

想要知道有几组也很简单,统计有几个根节点,pre[x] = x 如果他的根节点是他自己,那么他就是一个根节点了


最后附上完整代码:

import java.util.Scanner;

public class 畅通工程 {

	
	static int[] pre = new int[1000];
	
	static int find(int x){
		int r = x;
		while (pre[r] != r) {//因为根节点的上一级已经没有了,就是他自己,如果不是根节点就继续向上查找
			r = pre[r];
		}
		//此时r已经是根节点的值了
		return r;
	}
	
	//将x和y连通起来
	static void join(int x,int y){
		int a = find(x);
		int b = find(y);
		if (a != b) {
			pre[a] = b;
		}
	}
	
	static void init(){
		for (int i = 0; i < pre.length; i++) {
			pre[i] = i;
		}
	}
	
	public static void main(String[] args) {
		init();
		Scanner scanner = new Scanner(System.in);
		int N = scanner.nextInt();//城镇数
		int M = scanner.nextInt();//道路数
		for (int i = 0; i < M; i++) {
			int x = scanner.nextInt();
			int y = scanner.nextInt();
			join(x, y);
		}
		int count = 0;
		for (int i = 1; i <=N; i++) {
			if (find(i)==i) {
				count++;
			}
		}
		System.out.println(count-1);
	}
}
并查集的经典例题(二) 题目:村村通 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 “村村通工程” 的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路? 输入格式 输入包含若干组测试测试数据,每组测试数据的第一行给出两个用空格隔开的正整数,分别是城镇数目 n和道路数目 m;随后的 m行对应 m 条道路,每行给出一对用空格隔开的正整数,分别是该条道路直接相连的两个城镇的编号。简单起见,城镇从 1 到 n 阅读详情

相关推荐

HDU 1232 畅通工程 并查集入门经典 OJ题解

HDU1232 畅通工程一、背景简介二、题目描述Problem DescriptionInputOutputSample InputSample Output三、题解思路四、AC代码完整代码其他参考 一、背景简介 此题为并查集的经典例题,入门水准。如果想学习这个数据结构,一定要好好学习这个基础,模版可以背下来。题目来源为HDU 1232,具体链接为:http://acm.hdu.edu.cn/showproblem.php?pid=1232。 二、题目描述 Problem Description 某省调查城

Eechoecho的博客 664

数据结构——并查集

畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 在我们的测试数据文件夹中有一个trffic_project.txt文件,它就是诚征道路统计表,下面是对数据的解释: 总共有20个城市,目前已经修改好了7条道路,问还需要修建多少条道路,才能让这20个城市之间全部相通? 我们先不对本题进行解答,当我们对并查集了解之后便可以解决

weixin_44991304的博客 1086

【推荐算法】召回模型总结

【推荐算法】召回模型总结

m0_48086806的博客 6244

数据结构|并查集

畅通工程|浙大考研复试 描述 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 输入描述: 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。

weixin_43340821的博客 423

PCB工程师必看:别再搞错1078玻纤布的Dk了,手把手教你算等效介电常数

本文为PCB工程师提供了1078玻纤布等效介电常数(Dk)的详细计算指南,帮助解决高速设计中的信号完整性问题。通过解析玻纤布结构、混合介质理论和实战计算方法,指导工程师准确设置EDA工具参数,避免常见的Dk计算误区,提升设计精度和仿真准确性。

weixin_42546392的博客 399

E-Prime脑电实验打mark全攻略:从端口查询到串并口实战(附常见问题解决)

本文提供了E-Prime脑电实验打mark的完整实战指南,涵盖端口查询、并口与串口配置的核心步骤及常见问题解决。文章深入解析了mark原理,并详细介绍了通过E-Basic脚本和Serial设备对象发送信号的两种方法,帮助研究者实现E-Prime与脑电设备的高精度时间同步,确保实验数据可靠性。

4k5l6j7h8的博客 355

1003

题目编号:1003 题目大意:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不      一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 解题思路:题目大意说直白点就是求可以最少多少条线把子连通图连起来使其成为一个大的连通图。这道题用并查集的方法将每个子连通图表

M_yangjiayong的博客 740

知识见闻 - Salesforce公司发展史

不过,通过将自己开发的产品与公司收购的其它云产品进行结合,Salesforce可以为用户提供更多的产品种类,Salesforce可以继续强化自己的平台和产品套件属性,这一平台和套件的发展规模已经远远超出了一个单一的CRM的规模。他们围绕一个相对简单的产品向用户兜售云的概念,然后,他们开始开发其它产品,并寻找培育一个不断增长的生态系统的方法,最理想的情况是能驱动Salesforce的营收增长。现在,Salesforce通过打造更多的用例并改进自己产品的方式来直接应对竞争对手的竞争,从而捍卫自己现在的地位。

guoqx的专栏 1453

畅通工程:并查集入门裸题

畅通工程 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通 (但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? Input 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( &...

dizhoukong2188的博客 179

Yolov5自学笔记之一--从入门到入狱,功能强大不要乱用(实现yolov5的基本功能使用流程及训练自己的数据集)

零基础自学yolov5,学会简单使用和训练自己的数据集,在自己工作中使用

qq_41597915的博客 1万+

Android编译系统——Android.bp语法介绍(十五)

Android.bp 是 Android 构建系统(Android Build System)中的配置文件,用于描述如何编译和打包项目中的模块。它是用 Blueprint 编写的,其语法类似于 JSON,但专为 Android 编译系统设计,提供了更高效、灵活的模块化管理。

小旭的专栏 939

并查集入门题(畅通工程)

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? Input测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( &lt; 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正...

black_hole6的博客 393

基于深度学习的茶叶等级检测识别系统:YOLOv10 + UI界面 + 数据集

YOLOv10是YOLO系列的最新版本,继承了YOLO模型的优点,并对速度和精度进行了优化。YOLOv10在目标检测中使用卷积神经网络(CNN)作为基础,通过改进网络结构和优化训练策略,实现了在更低的延迟下进行高精度的目标检测。本文详细介绍了基于YOLOv10的茶叶等级检测与识别系统的设计与实现过程。我们从数据集准备、模型训练与推理、UI界面设计等多个方面进行了详细讲解,并给出了相应的代码实现。通过本系统,我们可以高效地自动检测茶叶的等级,并通过UI界面直观地展示结果。

YOLO 765

畅通工程(并查集)

畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? Input 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行...

Skyed_blue的博客 271

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

yilvyangguang520的博客 3991

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

学习并查集(一)——畅通工程

学习并查集,我以畅通工程这道经典的题为例,弄清楚如何进行处理,还有积累模板。 首先简单说一下并查集: 并查集是一种用来管理元素分组情况的数据结构,并查集可以高效地进行如下操作: 1、查:查询元素a和元素b是否属于同一组。实现:从一个组的根向另一个组的根连边,这样两棵树变成了一棵树,也就把两个组合并为一个组了。 2、并:合并元素a和元素b所在组。实现:如果两个节点的根相同,就可以知道它们属于同一组。...

weixin_40446193的博客 244

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

畅通工程(HDU 1232)经典并查集

#include <bits/stdc++.h> using namespace std; const int N = 1005; int table[N]; int findt(int x){ if(table[x]==-1){ return x; } table[x]=findt(table[x]); return table[x]; } void merge(int a, int b){ int ta=findt(a); int tb=findt(b); if(t

征服所有不服的博客 162

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

并查集入门(hdu1232“畅通工程”)

在学习并查集之前,首先需要明白基本的并查集可以完成的功能。并查集主要是用于处理不相交集合的合并问题。它是一种基础算法,在离散数学中,可以利用并查集求一个图的连通分支,利用其这个特性可以为我们解决一系列的问题,例如hdu1232"畅通工程"等等。在这里便利用这道题理解并查集的基本知识。 在讲解题目之前,先了解一下并查集。并查集就是将一系列的元素根据题中所给的相关关系,将它们分成一个个互不...

awli5131的博客 245

畅通工程(并查集)

1382:畅通工程时间限制: 1 Sec  内存限制: 32 MB题目描述某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?输入测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( &lt; ...

Revenant_Di的博客 518

HDU 1232 畅通工程 (第一道并查集,两种方式)

畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 44676    Accepted Submission(s): 23695 Problem Description 某省调查城镇交通状况,得到现有城镇道路

AC_Dreameng 3237

并查集回顾——以畅通工程为例

前言: 我浅显的把他定义为可以解决类似寻找联通路和独立块之类的问题。今年再拾起来的时候,自己敲代码的时候已经有了一种生疏的感觉,可见定期多看看自己以前写过的代码,学过的算法时多么重要啊~所以写今天这篇博客一方面是再把刚刚写过的复盘巩固一下,另一方面方便日后再进行回顾,还有要是或多或少帮助到屏幕前额你,我也感到十分荣幸。 这次还是用一道入门题来回顾:(题目来自HDU-OJ) Title 畅通工程 ...

weixin_43421663的博客 202

HDU 1232 畅通工程(经典题目,并查集)

畅通工程(进入题目) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 46646    Accepted Submission(s): 24826 Problem Description 某省调查城镇交通状况,得到

Shyazhut 451

畅通工程 简单并查集

畅通工程 畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 19157    Accepted Submission(s): 9848 Problem Description 某省调查城镇交通状况,得到现有城

qq490691606的专栏 520

畅通工程——并查集

Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? Input 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目...

逐梦er的博客 1532

经典并查集之畅通工程

这道题也是非常经典的并查集,类似于n个点,(n-1)条边的问题,以下是代码 #include using namespace std; int pre[20010]; void init (int n) { int i; for(i=0;i<=n;i++) pre[i]=i; } int find(int x) { int root=x; while(

bingbingsyr的专栏 464

并查集初阶:畅通工程问题

畅通工程问题是一个很经典的并查集问题。不是说这一题不可以用图论来解决,而是这题用并查集的思想省时省力,何乐而不为?并查集类的补充:Count函数 在我之前的一篇文章中,用一个类封装了并查集的基本操作。而现在我们针对在畅通工程中遇到的一个问题,我们对这个类进行一个简单的拓展,也就是增加一个简单的Count函数。这个函数用于计算集合的数量。 int Count(int s,int e)

Mollnn 960
上一篇: 第七届蓝桥杯取球博弈详解
下一篇: 蓝桥杯之三羊献瑞
白学家Lynn
博客等级 码龄10年 66粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值