连通图(并查集)

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;
int parent[100005];//记录每个点的根 
int rank_[100005];//记录集合的高度
//并查集初始化
void init(int n){
	for(int i=1;i<=n;i++){
		parent[i]=i;//每个点的父节点初始化为自己
		rank_[i]=1;//初始时所有树的高度为1 
	}
} 
//找到x的根,并压缩
int find(int x){
	if(parent[x]!=x)
		parent[x]=find(parent[x]);//路径压缩,使x直接指向根
	return parent[x]; 
} 
//合并x和y的集合
void union_sets(int x,int y){
	int rootx=find(x);
	int rooty=find(y);
	if(rootx!=rooty){
		if(rank_[rootx]>rank_[rooty])
			parent[rooty] = rootx;
		else if(rank_[rootx] < rank_[rooty])
			parent[rootx] = rooty;
		else{
			parent[rooty] = rootx;
			rank_[rootx]++;
		}
	}
} 

int main(){
	int n,m;
	while((scanf("%d %d",&n,&m))!=EOF){
		init(n);
		for(int i=0;i<m;i++){
			int x,y;
			cin >> x >> y;
			union_sets(x,y);
		}
		int root=find(1);
		bool connected = true;
		for(int i=2;i<=n;i++){
			if(find(i)!=root){
				connected=false;
				break;
			}
				
		}
		cout << (connected?"YES":"NO") << endl;
	}
	return 0;
}
相关推荐
FY_20189 分钟前
键盘输出希腊字符方法
开发语言
西西弗Sisyphus10 分钟前
Python 处理图像并生成 JSONL 元数据文件 - 灵活text版本
开发语言·python
Kidddddult17 分钟前
力扣刷题Day 46:搜索二维矩阵 II(240)
算法·leetcode·力扣
小王努力学编程36 分钟前
高并发内存池(三):TLS无锁访问以及Central Cache结构设计
jvm·数据结构·c++·学习
q567315231 小时前
Go语言多线程爬虫与代理IP反爬
开发语言·爬虫·tcp/ip·golang
Chandler241 小时前
Go语言即时通讯系统 开发日志day1
开发语言·后端·golang
强化学习与机器人控制仿真1 小时前
openpi 入门教程
开发语言·人工智能·python·深度学习·神经网络·机器人·自动驾驶
不是吧这都有重名2 小时前
[论文阅读]Deeply-Supervised Nets
论文阅读·人工智能·算法·大语言模型
homelook2 小时前
matlab simulink双边反激式变压器锂离子电池均衡系统,双目标均衡策略,仿真模型,提高均衡速度38%
算法
明月看潮生2 小时前
青少年编程与数学 02-019 Rust 编程基础 08课题、字面量、运算符和表达式
开发语言·青少年编程·rust·编程与数学