【专题复习5:并查集】1107、1114、1118

1107

1107

i号同学:喜欢的活动1、喜欢的活动2...
1:5 6 
course[5]=1 course[6]=1
---------------------------------
2:5
union(2,findFather(course[5]))->
union(2,1)
2->1
---------------------------------
3:5
union(3,findFather(course[5]))->
union(3,1)
3->1
---------------------------------

点击查看代码
#include <bits/stdc++.h>

using namespace std;
int father[1010],course[1010],isRoot[1010];
int findFather(int x){
    while(x!=father[x]){
        x=father[x];
    }
    return x;
}
void Union(int a,int b){
    int faA=findFather(a);
    int faB=findFather(b);
    if(faA!=faB)
        father[faA]=faB;
}
void init(int n){
    for(int i=1;i<=n;i++){
        father[i]=i;
        isRoot[i]=false;
    }
}
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif
    int n,k,h;
    cin>>n;
    init(n);
    for(int i=1;i<=n;i++){
        scanf("%d:",&k);
        for(int j=0;j<k;j++){
            cin>>h;
            if(course[h]==0)
                course[h]=i;
            Union(i,findFather(course[h]));
        }
    }
    for(int i=1;i<=n;i++)
        isRoot[findFather(i)]++;
    int ans=0;
    for(int i=1;i<=n;i++){
        if(isRoot[i]!=0)
            ans++;
    }
    cout<<ans<<endl;
    sort(isRoot+1,isRoot+n+1,greater<int>());
    for(int i=1;i<=ans;i++){
        cout<<isRoot[i];
        if(i<ans) cout<<" ";
    }
    return 0;
}

1114

1114

点击查看代码
#include <bits/stdc++.h>

using namespace std;
struct Data
{
    int id,fid,mid,num,area;
    int cid[10];
}Data[1005];
struct node
{
    int id,people;
    double num,area;
    bool flag=false;
}ans[10000];
int father[10000],vis[10000];
int findFather(int x){
    while(x!=father[x]){
        x=father[x];
    }
    return x;
}
void Union(int a,int b){
    int faA=findFather(a);
    int faB=findFather(b);
    if(faA>faB)
        father[faA]=faB;
    else if(faA<faB)
        father[faB]=faA;
}
bool cmp(node a,node b){
    if(a.area!=b.area) return a.area>b.area;
    else return a.id<b.id;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif
    int n,k;
    cin>>n;
    for(int i=0;i<10000;i++){
        father[i]=i;
    }
    for(int i=0;i<n;i++){
        cin>>Data[i].id>>Data[i].fid>>Data[i].mid>>k;
        vis[Data[i].id]=true;
        if(Data[i].fid!=-1){
            Union(Data[i].id,Data[i].fid);
            vis[Data[i].fid];
        }
        if(Data[i].mid!=-1){
            Union(Data[i].id,Data[i].mid);
            vis[Data[i].mid];
        }
        for(int j=0;j<k;j++){
            cin>>Data[i].cid[j];
            Union(Data[i].id,Data[i].cid[j]);
            vis[Data[i].cid[j]]=true;
        }
        cin>>Data[i].num>>Data[i].area;
    }
    for(int i=0;i<n;i++){
        int id=findFather(Data[i].id);
        ans[id].id=id;
        ans[id].num+=Data[i].num;
        ans[id].area+=Data[i].area;
        ans[id].flag=true;
    }
    int cnt=0;
    for(int i=0;i<10000;i++){
        if(vis[i]=true)
            ans[findFather(i)].people++;
        if(ans[i].flag==true)
            cnt++;
    }
    for(int i=0;i<10000;i++){
        if(ans[i].flag){
            ans[i].num=(double)(ans[i].num*1.0/ans[i].people);
            ans[i].area=(double)(ans[i].area*1.0/ans[i].people);
        }
    }
    sort(ans,ans+10000,cmp);
    cout<<cnt<<endl;
    for(int i=0;i<cnt;i++){
        printf("%04d %d %.3f %.3f\n",ans[i].id,ans[i].people,ans[i].num,ans[i].area);
    }
    return 0;
}

1118

1118

点击查看代码
#include <bits/stdc++.h>

using namespace std;
int father[10000],vis[10000],isRoot[10000];
int findFather(int x){
    while(x!=father[x]){
        x=father[x];
    }
    return x;
}
void Union(int a,int b){
    int faA=findFather(a);
    int faB=findFather(b);
    if(faA>faB)
        father[faA]=faB;
    else if(faA<faB)
        father[faB]=faA;
}

int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif
    int n,tmp,k,cnt=0,birds=0;
    cin>>n;
    for(int i=1;i<=10000;i++){
        father[i]=i;
    }
    int id, temp;
    for(int i = 0; i < n; i++) {
        scanf("%d%d", &k, &id);
        vis[id] = true;
        for(int j = 0; j < k-1; j++) {
            scanf("%d", &temp);
            Union(id, temp);
            vis[temp] = true;
        }
    }
    for(int i=1;i<=10000;i++){
        if(vis[i]){
            isRoot[findFather(i)]++;
            birds++;
        }
    }
    for(int i=1;i<=10000;i++){
        if(vis[i]&&isRoot[i]){
            cnt++;
        }
    }
    //sort(isRoot,isRoot+10000,greater<int>());
    cout<<cnt<<" "<<birds<<endl;
    int query,a,b;
    cin>>query;
    while(query--){
        cin>>a>>b;
        int faa=findFather(a);
        int fab=findFather(b);
        if(faa==fab)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}

posted @ 2022-03-02 17:11  勇往直前的力量  阅读(64)  评论(0编辑  收藏  举报