并查集。
题目:http://ac.jobdu.com/problem.php?pid=1526
#include <stdio.h>
#include <cmath>
#include <string.h>
#include <iostream>
using namespace std;
const int maxn = 100005;
int father[maxn];
int rank[maxn];
int flag[maxn];
int n,m;
void make_set(int n){
for(int i = 1;i <= n;i++){
father[i] = i;
rank[i] = 0;
}
}
int find_set(int x){
if(father[x] == x)
return x;
return father[x] = find_set(father[x]);
}
void union_set(int x,int y){
int xx = find_set(x);
int yy = find_set(y);
if(xx == yy) return;
if(rank[xx] > rank[yy])
father[yy] = xx;
else{
if(rank[xx] == rank[yy])
rank[yy]++;
father[xx] = y;
}
}
int count_set(){
int ans = 0;
memset(flag,0,sizeof(flag));
for(int i = 1;i <= n;i++){
flag[find_set(i)]++;
//printf("%d *\n",find_set(i));
}
for(int i = 1;i <= n;i++)
if(flag[i])
ans++;
return ans;
}
int main(){
while(~scanf("%d%d",&n,&m)&&n){
make_set(n);
int x,y;
for(int i = 0;i < m;i++){
scanf("%d%d",&x,&y);
union_set(x, y);
}
printf("%d\n",count_set());
}
return 0;
}