题意:找出M个俱乐部中最大朋友圈数量,朋友的朋友也朋友,所以可以采用并查集写此算法。
开始自己把题目理解错了,最后看了大神的写法终于明白了。
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int par[100005];
int n;
void init(){
for(int i=0;i<=n;i++){
par[i]=i;
}
}
int findParent(int x){ //找祖先
int r=x;
if(r==par[x]){
return x;
}
return par[x]=findParent(par[x]);
}
void unionSet(int x, int y){ // 合并集合
x = findParent(x);
y = findParent(y);
if (x == y)
return ;
par[y] = x;
}
int main() {
int m, mk;
int x;
map<int, int> mmp;
cin >> n >> m;
init();
for (int i = 0; i < m; i++){ // 俱乐部
vector<int> v;
cin >> mk;
for (int j = 0; j < mk; j++){
cin >> x;
v.push_back(x);
}
for (int j = 0; j < mk; j++)
for (int k = j+1; k < mk; k++)
unionSet(v[j], v[k]);
}
for (int i = 1; i <= n; i++)
mmp[findParent(i)]++;
int most = 0;
for (map<int,int>::iterator it = mmp.begin();
it != mmp.end(); it++)
most = max(most, it->second);
cout << most;
return 0;
}