连通图(并查集)

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;
}
相关推荐
LMT流氓兔7 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真7 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄7 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
外收内放8 小时前
Python基础语法练习题(75)
开发语言·python·学习
Tisfy8 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划
starzy19908 小时前
Scala循环与判断:一切皆表达式的控制流
开发语言·人工智能·scala
starzy19909 小时前
Scala类和对象:从构造器到样例类的完整指南
开发语言·后端·scala
niucloud-admin9 小时前
NIUCLOUD PHP SAAS上门家政使用文档--服务订单:订单列表
开发语言·php
D e re k ZH9 小时前
P5025 [SNOI2017] 炸弹
c++·算法
A boy CDEF girl9 小时前
算法题专栏:优选算法
数据结构·算法·leetcode