题目大意:
有n个人坐座位,他们只和认识的人坐一桌,小红认识小明,小明认识小刚,那么小红和小刚也算认识,问你要几个桌子。
思路:
如果我不知道并查集估计能写很多思路,但是上次刚好遇见过同类题,刚好虚心的请教了下师兄,然后试着敲了下就AC了。。。
#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
int pre[1001];
int find_(int x){
int t = x;
if(pre[t] == 0){
pre[t] = t;
}
while(pre[t] != t){
t = pre[t];
}
return t;
}
bool join_(int x, int y){
int xx = find_(x);
int yy = find_(y);
if(xx != yy){
pre[xx] = yy;
return false;
}
return true;
}
int main(){
ios::sync_with_stdio(false);
int n;
scanf("%d", &n);
while(n--){
int N, M;
memset(pre, 0, sizeof(pre));
scanf("%d%d", &N, &M);
for(int i = 1; i <= M; i++){
int a, b;
scanf("%d%d", &a, &b);
join_(a, b);
}
int count[N+1];
memset(count, 0, sizeof(count));
for(int i = 1; i <= N; i++){
count[find_(i)]++;
}
int ret = 0;
for(int i = 1; i <= N; i++){
if(count[i]){
ret++;
}
}
printf("%d\n", ret);
}
}