模板:
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 }