并查集 发表于 2020-08-18 | 分类于 数据结构 | 次阅读 字数统计: 237 | 阅读时长 ≈ 1 基本代码 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include<bits/stdc++.h>using namespace std;int n;vector<int> parent;int Find(int x){ // 并查集的查找父亲节点函数 int origin = x; while(x != parent[x]){ x = parent[x]; } parent[origin] = x; // 查找的过程中顺便路径压缩 return x;}void to_union(int x1 , int x2){ // 将两个节点合并 int p1 = Find(x1); int p2 = Find(x2); parent[p2] = p1;}bool isSame(int x1 , int x2){ // 判断两个节点的父亲节点是不是相同 return Find(x1) == Find(x2);}int main(){ //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); cin>>n; for(unsigned int i = 0 ; i<n ; ++i){ parent.push_back(i); // 初始化每个节点的父亲节点是自己 } int u , v; int m; cin>>m; for(int i = 0 ; i<m ; ++i){ cin>>u>>v; to_union(u , v); } for(int i = 0 ; i<n ; ++i){ Find(i); // 每个节点都路径压缩 } for(int i = 0 ; i<n ; ++i){ cout<<parent[i]<<' '; }}