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]);
            }
        }
    }
  • 相关阅读:
    [转]C#中抽象类和接口的区别
    [转]OO设计原则总结
    [转]MVC3快速搭建Web应用(三)实例篇
    原生内存(堆外内存)
    使用SAX解析XML实例根据属性查找
    Cannot forward after response has been committed问题解决及分析
    dubbo服务化实施整理
    bean:write 标签不能显示出 换行符的解决方案
    Dubbo原理解析监控
    thread之1:java与线程
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/10801223.html
Copyright © 2011-2022 走看看