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 }