zoukankan      html  css  js  c++  java
  • 并查集加优先队列

    J - Welcome Party

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+10;
    int f[maxn];
    int visf[maxn];
    int vis[maxn];
    int as[maxn];
    vector<int> v[maxn];
    priority_queue<int,vector<int>,greater<int> > q;
    int getf(int a)
    {
        if(f[a]==a) return a;
        else return f[a]=getf(f[a]);
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int n,m;
            scanf("%d%d",&n,&m);
            while(q.size()) q.pop();
            for(int i=1; i<=n; i++)
            {
                f[i]=i;
                vis[i]=0;
                visf[i]=0;
                v[i].clear();
            }
            for(int i=1; i<=m; i++)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                f[getf(b)]=getf(a);
                v[a].push_back(b);
                v[b].push_back(a);
            }
            int ans=0;
            for(int i=1; i<=n; i++)
            {
                if(getf(i)==i) ans++;
                if(visf[getf(i)]==0)
                {
                    q.push(i);
                    visf[getf(i)]=1;
                    vis[i]=1;
                }
            }
            int len=0;
            while(!q.empty())
            {
                int t1=q.top();
                q.pop();
                as[++len]=t1;
                for(int i=0; i<v[t1].size(); i++)
                {
                    int y=v[t1][i];
                    if(vis[y]) continue;
                    q.push(y);
                    vis[y]=1;
                }
            }
            printf("%d
    ",ans);
            for(int i=1; i<=len; i++)
            {
                if(i!=len) printf("%d ",as[i]);
                else printf("%d
    ",as[i]);
            }
        }
    }

     

    邻接表也是可以过的,,注意!!存有向图,数组开边的二倍!!初始化时要用memset(a,0,(m+1)*sizeof(int))

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+10;
    int f[maxn];
    int visf[maxn];
    int vis[maxn];
    int as[maxn];
    //vector<int> v[maxn];
    const int maxm=2e6+10;
    int tot=0,head[maxm],nxt[maxm],ver[maxm];
    void add(int u,int v)
    {
        ver[++tot]=v;
        nxt[tot]=head[u];
        head[u]=tot;
    }
    priority_queue<int,vector<int>,greater<int> > q;
    int getf(int a)
    {
        if(f[a]==a) return a;
        else return f[a]=getf(f[a]);
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int n,m;
            scanf("%d%d",&n,&m);
            memset(ver,0,(m*2+1)*sizeof(int));
            memset(nxt,0,(m*2+1)*sizeof(int));
            while(q.size()) q.pop();
            for(int i=1; i<=n; i++)
            {
                f[i]=i;
                head[i]=0;
                vis[i]=0;
                visf[i]=0;
    //            v[i].clear();
            }
            tot=0;
            for(int i=1; i<=m; i++)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                f[getf(b)]=getf(a);
                add(a,b);
                add(b,a);
    //            v[a].push_back(b);
    //            v[b].push_back(a);
            }
            int ans=0;
            for(int i=1; i<=n; i++)
            {
                if(getf(i)==i) ans++;
                if(visf[getf(i)]==0)
                {
                    q.push(i);
                    visf[getf(i)]=1;
                    vis[i]=1;
                }
            }
            int len=0;
            while(!q.empty())
            {
                int t1=q.top();
                q.pop();
                as[++len]=t1;
                for(int i=head[t1]; i; i=nxt[i])
                {
                    int y=ver[i];
                    if(vis[y]) continue;
                    q.push(y);
                    vis[y]=1;
                }
    //            for(int i=0; i<v[t1].size(); i++)
    //            {
    //                int y=v[t1][i];
    //                if(vis[y]) continue;
    //                q.push(y);
    //                vis[y]=1;
    //            }
            }
            printf("%d
    ",ans);
            for(int i=1; i<=len; i++)
            {
                if(i!=len) printf("%d ",as[i]);
                else printf("%d
    ",as[i]);
            }
        }
    }
  • 相关阅读:
    mybatis自学历程(二)
    mybatis自学历程(一)
    Hibernate入门教程(二):Hibernate核心API
    Hibernate入门教程(一):入门示例(Myeclipse)
    Python中反射的简单应用
    Struts2的Action访问
    Myeclipse中dtd代码提示
    B/+、索引原理
    postgres 模糊匹配
    jvm_第三章:垃圾收集与内存分配策略
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/10801223.html
Copyright © 2011-2022 走看看