题目大意:
A跟B是朋友,B跟C是朋友。那么A与C也是朋友。
给出朋友的关系,问最多可以有多少个人是朋友
思路:
并查集
代码:
#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
#include <queue>
int f[30005];
int rank[30005];
int size[30005];
int x[500005],y[500005];
int m,n;
void init() {
for(int i = 0; i <= n; i++) {
size[i] = 1;
f[i] = i;
rank[i] = 0;
}
}
int find(int x) {
int k = x;
while(k != f[k]) {
k = f[k];
}
return k;
}
int Union(int x,int y) {
if(rank[x] > rank[y]) {
f[y] = x;
size[x] += size[y];
}
else {
f[x] = y;
size[y] +=size[x];
if(rank[x] == rank[y])
rank[y]++;
}
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d %d",&n,&m);
init();
for(int i = 0; i < m; i++)
scanf("%d %d",&x[i],&y[i]);
for(int i = 0; i < m; i++) {
int a = find(x[i]);
int b = find(y[i]);
if(a != b)
Union(a,b);
}
int _max = 1;
for(int i = 1; i <= n; i++ ) {
//cout << size[i] <<endl;
if(size[i] > _max )
_max= size[i];
}
printf("%d\n",_max);
}
return 0;
}