美文网首页
Minimum Spanning Tree

Minimum Spanning Tree

作者: fo0Old | 来源:发表于2017-04-25 00:16 被阅读0次
    struct DisjointSetUnion
    {
        static const int __=10005;
        int pre[__];
        DisjointSetUnion() {memset(pre,-1,sizeof(pre));}
        void un(int x,int y)
        {
            x=fd(x),y=fd(y);
            if(x==y)return;
            if(pre[x]<pre[y])
                pre[x]+=pre[y],pre[y]=x;
            else
                pre[y]+=pre[x],pre[x]=y;
        }
        int fd(int x)
        {
            if(pre[x]<0)return x;
            return pre[x]=fd(pre[x]);
        }
        void clear(){memset(pre,-1,sizeof(pre));}
    }dsu;
    

    Kruskal

    struct Kruskal
    {
        static const int __=100005;
        int edge_num;
        struct edge
        {
            int x,y,z;
            bool operator<(const edge& b)const
            {
                return z<b.z;
            }
            void set(int _x,int _y,int _z)
            {
                x=_x,y=_y,z=_z;
            }
        }e[__*2];
    
        //并查集板子
    
        void scan()
        {
            fup(i,1,edge_num)
            {
                int x,y,z;
                sf("%d%d%d",&x,&y,&z);
                e[i].set(x,y,z);
            }
        }
    
        void solve()
        {
            sort(e+1,e+edge_num+1);
            fup(i,1,edge_num)
            {
                if(dsu.fd(e[i].x)!=dsu.fd(e[i].y))
                {
                    lca.add_edge(e[i].x,e[i].y,e[i].z);
                    lca.add_edge(e[i].y,e[i].x,e[i].z);
                    dsu.un(e[i].x,e[i].y);
                }
            }
        }
    
        void clear(){mem(dsu.pre,-1);}
    }M;
    
    struct mst
    {
        static const int _n_=1005,_e_=1000005;
        struct edge
        {
            int nex,dis,nex_edge;
            edge() {}
            edge(int x,int y,int z=0):
                nex(x),dis(y),nex_edge(z) {}
            bool operator<(const edge& b)const
            {
                return dis>b.dis;
            }
        }e[_e_<<1];
        int head[_n_],dis[_n_],ne;
        bool vis[_n_];
        mst():ne(0){memset(head,-1,sizeof(head));}
        void add_edge(int x,int y,int dis)
        {
            e[ne]=edge(y,dis,head[x]);
            head[x]=ne++;
        }
        int prim()
        {
            int sum=0;
            memset(vis,false,sizeof(vis));
            memset(dis,0x3f3f3f3f,sizeof(dis));
            priority_queue<edge>Q;
            dis[1]=0,Q.push(edge(1,0));
            while(!Q.empty())
            {
                edge t=Q.top();
                Q.pop();
                if(vis[t.nex])continue;
                sum+=t.dis;
                vis[t.nex]=true;
                for(int i=head[t.nex];~i;i=e[i].nex_edge)
                    if(!vis[e[i].nex] && e[i].dis<dis[e[i].nex])
                    {
                        dis[e[i].nex]=e[i].dis;
                        Q.push(edge(e[i].nex,e[i].dis));
                    }
            }
            return sum;
        }
        void clear(){ne=0,memset(head,-1,sizeof(head));}
    }prim;
    

    相关文章

      网友评论

          本文标题:Minimum Spanning Tree

          本文链接:https://www.haomeiwen.com/subject/qiymzttx.html