连通图(并查集)

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;
}
相关推荐
16月6日-晴8 分钟前
Java面向对象进阶—static
java·开发语言
爱跳舞的烤冷面8 分钟前
自学嵌入式第16天(数据结构篇--链表进阶操作)
开发语言
持敬chijing21 分钟前
PHP开发-环境搭建-安装phpstudy-vscode工具
开发语言·vscode·php
致Great24 分钟前
科研人的 AI,不该只回答问题:我用字节TraeWork 跑了一遍真实研究任务
算法
纵有疾風起26 分钟前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
charlie1145141911 小时前
Cinux · 第一次跳进 Ring 3:用户态与特权隔离
开发语言·c++·操作系统·开源项目
别动我齐刘海1 小时前
机器学习基础2——C++、OpenCV、点云、Open3D
c++·人工智能·opencv·机器学习·计算机视觉·机器人·ros2
测试_AI_一辰1 小时前
AI Agent 评测最隐蔽的坑-记忆
人工智能·算法·ai·自动化·ai编程
躺不平的理查德1 小时前
Windows C++ 第三方库使用流程备忘录--OpenCV
开发语言·c++
余额瞒着我当琳1 小时前
C++STL容器string--迭代器,string的接口,string的遍历,访问方式
c++