并查集水题,题意:一个人请人吃饭,相互认识的朋友在一张桌子,相互认识的朋友的意思是如果A认识B,B认识C,那么A、B、C是朋友,对于每组输入输出桌子的张数。贴代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX = 1002;
int M, N, T;
int father[MAX];
void init()
{
for(int i=0; i<=N; ++i)
father[i] = i;
}
int Find(int x)
{
return father[x]==x ? x : father[x]=Find(father[x]);
}
void combin(int a, int b)
{
int pa = Find(a), pb = Find(b);
if(pa != pb)
father[pa] = pb;
}
int main()
{
int a, b;
while(~scanf("%d", &T))
{
while(T--)
{
scanf("%d%d", &N, &M);
init();
while(M--)
{
scanf("%d%d", &a, &b);
combin(a, b);
}
int numb = 0;
for(int i=1; i<=N; ++i)
{
if(father[i] == i)
++numb;
}
cout << numb << endl;
}
}
return 0;
}
水题留念~