1501: Friends 并查集

描述

 

有一些人一起旅行。他们中的一些人是朋友。朋友关系是传递性的,即如果A和B是朋友,B和C是朋友,那么A和C也会成为朋友。

这些人打算在酒店预订一些房间。但是他们每个人都不想和陌生人住在一起,也就是说,如果A和D不是朋友,他们是不能住一个房间的。

鉴于这些人的信息,你能确定他们至少要预订多少间客房吗?您可以假设房间足够大。

 

输入

 

输入的第一行是测试用例的数量,然后是一些测试用例。

每个测试用例的第一行包含两个整数N和M,表示人数和他们之间的关系数。后面M行每行包含两个数A和B(1≤A≤N,1≤B≤N,A≠B),说明A和B是朋友。

您可以假设 1 ≤ N ≤ 100,0 ≤ M ≤ N * (N-1) / 2。所有的人都从 1 到 N 编号。

 

输出

为每个测试用例输出一行,表示他们必须预订的最少房间数。

样例输入

 

3
5 3
1 2
2 3
4 5
5 4
1 2
2 3
3 4
4 5
10 0

样例输出

2
1
10

 

思路:把所有点并在一起,最后有几个祖先就开几间房

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int inf = 1e6;
 4 int f[inf];
 5 int a,b;
 6 int find(int x)
 7 {
 8     if(f[x]!=x)f[x] = find(f[x]);
 9     return f[x];
10 }
11 void merger(int x,int y)
12 {
13     int fx = find(x);
14     int fy = find(y);
15     f[fx] = fy;
16 }
17 int main()
18 {
19     int t;
20     cin>>t;
21     while(t--)
22     {
23         int n,m;
24         cin>>n>>m;
25         for(int i=1;i<=n;i++)f[i] = i;
26         for(int i=1;i<=m;i++)
27         {
28             cin>>a>>b;
29             if(find(f[a])!=find(f[b]))
30             {
31                 merger(a,b);
32             }
33         }
34         int sum = 0;
35         for(int i=1;i<=n;i++)
36             if(f[i]==i)sum++;
37         cout<<sum<<endl;
38     }
39      return 0;
40 }

 

posted @ 2023-03-02 21:11  CRt0729  阅读(17)  评论(0编辑  收藏  举报