EOJ_1081_朋友圈

//每个俱乐部的第一个人是老大,但是要知道每个俱乐部的老大是不是别人的小弟,
//原则是,每次合并关系,都是老大和老大的比较
#include<bits/stdc++.h>

using namespace std;

int parent[30003];

int findParent(int parent[], int i)
{
    int tmpi = i;
    while(parent[i]>=0) i = parent[i];
    //路径压缩
    while(tmpi!=i){
        int tmpParent = parent[tmpi];
        parent[tmpi] = i;
        tmpi = tmpParent;
    }
    return i;
}

int unionParent(int parent[], int i, int j)
//返回根节点
{
    int rooti = findParent(parent, i);
    int rootj = findParent(parent, j);
    if(rootj==rooti) return rooti;
    int tmpCount= parent[rooti] + parent[rootj];
    if(parent[rooti]>parent[rootj]){
        parent[rooti] = rootj;
        parent[rootj] = tmpCount;
        return rootj;
    }
    else{
        parent[rootj] = rooti;
        parent[rooti] = tmpCount;
        return rooti;
    }
}

int main()
{
    int numStu, numClub;
    cin>>numStu>>numClub;
    int cnt=-1,ans=-1;
    for(int i=0;i<numStu;i++) parent[i]=-1;
    
    for(int i=0;i<numClub;i++){
        int stuClub,tmpRoot;
        cin>>stuClub>>tmpRoot;
        for(int j=1;j<stuClub;j++){
            int tmpStu;
            cin>>tmpStu;
            cnt = unionParent(parent, tmpRoot, tmpStu);
            ans = min(ans, parent[cnt]);
        }
    }
    cout<<-ans<<endl;
    return 0;
}
上一篇:EOJ数据结构1088 dijkstra算法 优先队列实现


下一篇:2021秋季《数据结构》_ EOJ 1096.Building Roads