[模板][图论] 克鲁斯卡尔 Kruskal
Templates 图论 MST
Lastmod: 2020-09-30 周三 21:39:24

克鲁斯卡尔 Kruskal

template<typename T,size_t V,size_t E>
struct Kruskal
{
    typedef tuple<T,int,int> Edge;
    typedef pair<T,int> PTI;
    Edge edges[E];
    int inmst[E];
    int n; // number of vertex
    int m; // number of edge
    int uf[V];
    int find(int x)
    { return x==uf[x]?x:uf[x]=find(uf[x]); }
    void init(int n_) { n=n_; m=0; }
    void addedge(int u,int v,T w)
    { edges[m++]={w,u,v}; }

    PTI solve()
    {
        int cnt=n; // number of connected component
        T sum=0;
        int u,v; T w;
        for(int i=0;i<n;i++) uf[i]=i;
        sort(edges,edges+m);
        for(int i=0;i<m&&cnt>1;i++)
        {
            tie(w,u,v)=edges[i];
            u=find(u); v=find(v);
            if(u==v) continue;
            inmst[i]=1; sum=sum+w;
            cnt--; uf[u]=v;
        }
        return {sum,cnt==1}; // {totval in mst, ismst}
    }
};
Prev: [模板][图论] 弗洛伊德 Floyd
Next: [模板][数据结构] 左偏树 Leftist Tree