码迷,mamicode.com
首页 > 其他好文 > 详细

GPLT L2-024 部落 (并查集)

时间:2020-03-17 12:42:21      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:运行   hellip   0ms   ips   const   mes   nio   ++   find   

 

Tips:

这种数据如果没有路径压缩的话是很容易超时的。

5001

2 1 2

2 3 4

2 5 6

……

2 9997 9998

2 9999 10000

5000 1 3 5 …… 9997 9999

10000

10000 10000

……

10000 10000

${O_{\left( n^2/2 \right)}}$:

#include <bits/stdc++.h>
using namespace std;

const int M=11000;

int fri[M];
bool vis[M];

int Find(int x){
    while(x!=fri[x]) x=fri[x];
    return x;
}

void Union(int A,int B){
    int friA=Find(A);
    int friB=Find(B);
    if(friA>friB) fri[friA]=friB;
    if(friB>friA) fri[friB]=friA;
}

int main()
{
    for(int i=0;i<M;i++) fri[i]=i;
    int n;cin>>n;
    for(int i=0;i<n;i++){
        int k;cin>>k;
        int a[k];
        for(int j=0;j<k;j++){
            cin>>a[j];
            vis[a[j]]=true;
            if(j) Union(a[j],a[j-1]);
        }
    }
    int people=0,tribe=0;
    for(int i=0;i<M;i++){
        if(vis[i]) ++people;
        if(vis[i]&&fri[i]==i) ++tribe;
    }
    cout<<people<<" "<<tribe<<"\n";
    int q;cin>>q;
    for(int i=0;i<q;i++){
        int a,b;cin>>a>>b;
        cout<<(Find(a)==Find(b)?"Y":"N")<<"\n";
    }
    return 0;
}

${O_{\left( n \right)}}$:

#include <bits/stdc++.h>
using namespace std;

const int M=11000;

int fri[M];
bool vis[M];

int Find(int x){
    int f=x;
    while(f!=fri[f]) f=fri[f];
    int a=x,b;
    while(a!=fri[a]) b=fri[a],fri[a]=f,a=b; 
    return f;
}

void Union(int A,int B){
    int friA=Find(A);
    int friB=Find(B);
    if(friA>friB) fri[friA]=friB;
    if(friB>friA) fri[friB]=friA;
}

int main()
{
    for(int i=0;i<M;i++) fri[i]=i;
    int n;cin>>n;
    for(int i=0;i<n;i++){
        int k;cin>>k;
        int a[k];
        for(int j=0;j<k;j++){
            cin>>a[j];
            vis[a[j]]=true;
            if(j) Union(a[j],a[j-1]);
        }
    }
    int people=0,tribe=0;
    for(int i=0;i<M;i++){
        if(vis[i]) ++people;
        if(vis[i]&&fri[i]==i) ++tribe;
    }
    cout<<people<<" "<<tribe<<"\n";
    int q;cin>>q;
    for(int i=0;i<q;i++){
        int a,b;cin>>a>>b;
        cout<<(Find(a)==Find(b)?"Y":"N")<<"\n";
    }
    return 0;
}

 事实上,二者的运行时间都为 50ms 左右。

GPLT L2-024 部落 (并查集)

标签:运行   hellip   0ms   ips   const   mes   nio   ++   find   

原文地址:https://www.cnblogs.com/Kanoon/p/12509866.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!