How Many Tables
<
历经千辛万苦,tgy终于成功狩猎了青电主。为了庆祝,他邀请了很多朋友来开庆功宴。然而,tgy的朋友们不是都互相认识,所有的人都不想和陌生人坐在一起。
但是如果A认识B, B认识C,那A, B, C就假装认识,所以他们就可以在一张桌子上吃饭。
如果A知道B, B知道C, D知道E,那么A、B、C可以留在一起,而D、E必须在另一张桌子吃饭。至少需要两张桌子。
tgy想知道他至少需要多少张桌子。
一、Input and output
输入以一个整数T(1<=T<=25)开始,它表示测试用例的数量。然后是测试用例。每个测试用例都以两个整数N和M开始(1<=N,M<=1000)。N表示朋友的数量,从1到N标记朋友,之后的M行,每一行由两个整数A和B(A!=B)组成,这意味着朋友A和朋友B相互认识。两种情况之间会有一条空行。
对于每个测试用例,只需输出至少需要多少张桌子。不要打印任何空格。
二、样例
对于每个测试用例,只需输出至少需要多少张桌子。不要打印任何空格。
1.样例输入
2
5 3
1 2
2 3
4 5
5 1
2 5
2.样例输出
2
4
3.代码
代码如下(示例):
#include <iostream>
using namespace std;
int father[30100];
int find_root(int x)//寻找根节点并且压缩路径
{
if (father[x] == x) return x;
else return father[x] = find_root(father[x]);
}
void mergee(int x,int y)//合并两个数
{
int xx = find_root(x);
int yy = find_root(y);
if (xx > yy) father[xx] = yy;
else if (xx < yy) father[yy] = xx;
}
int main()
{
int m,n;
while(cin >> m >> n)
{
if (m == 0 && n == 0) break;
for (int i = 0;i <m;i++)
{
father[i] = i;//初始化
}
int sum = 0;
for (int i = 0;i < n;i++)
{
int num,flag1,flag2;
cin >> num >> flag1;
for (int j = 1;j < num;j++)
{
cin >> flag2;
mergee(flag1,flag2);
}
}
for (int i = 0;i < m;i++)
{
if (find_root(i) == 0) sum++;
}
cout << sum << endl;
}
}