并查集

模板:

int fa[N];
void init(int n) { 
for (int i = 0; i <= n; i++)
fa[i] = i;
}
}
void unin(int u, int v) {//合并操作
int fau = find(u);
int fav = find(v);
if (fau == fav) return;
fa[fav] = fau;//压缩路径
}

int find(int u) {//合编号操作
if (fa[u] != u) {
fa[u] = find(fa[u]);
}
return fa[u];
}

简短版^...^

int fa[N];
void init(int n) {
for (int i = 0; i <= n; fa[i] = i) fa[i] = i;
}
void unin(int u, int v) {
fa[find(v)] = find(u);
}
int find(int u) {
return fa[u] == u ? fa[u] : fa[u] = find(fa[u]);
}

做一个小题吧

HRBUST1073 http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1073

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<iostream>
 5 using namespace std;
 6 int fa[100010];
 7 int fin(int u){
 8 if(fa[u]!=u)
 9     fa[u]=fin(fa[u]);
10 return fa[u];
11 }
12 void unin(int u,int v)
13 {
14     fa[fin(v)]=fin(u);
15 }
16 int main()
17 {
18     int n,m;
19 
20     int a,b;
21     while(cin>>n>>m){
22             for(int i=0;i<=n;i++)
23             fa[i]=i;
24             for(int i=0;i<m;i++){
25                 cin>>a>>b;
26                 unin(a,b);
27             }
28             int ans=0;
29             for(int i=0;i<n;i++){
30                 if(fin(i)==fin(0))
31                     ans++;
32             }
33             cout<<ans<<endl;
34 }
35 }
View Code
你若盛开,清风自来...
原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5741670.html