最小生成树

来源:互联网 发布:微信 知乎 编辑:程序博客网 时间:2024/06/06 10:06

前言

最小生成树的使用范围应该不大,但还是常用的。

Prim

code

    struct Prim{        bool used[M];        int mincost[M];        int cost[M][M];        void solve(){//O(n log m)            mcl(mincost,63);            mcl(used,0);            mincost[1]=0;            int res=0;            while(1){                int v=-1;                REP(i,1,n)                    if(!used[i] && (v==-1 || mincost[i]<mincost[v]))v=i;                if(v==-1)break;                used[v]=1;                res+=mincost[v];                REP(i,1,n)                    mincost[i]=min(mincost[i],cost[v][i]);            }        }    }Prim;

Kruskai

code

    struct Kruskai{//O(n log m)        struct edge{            int from,to,cost;            bool operator<(const edge&_)const{                return cost<_.cost;            }        }es[M<<1];        int fa[M];//并查集         int Find(int x){return fa[x]==x?x:fa[x]=Find(fa[x]);}        void solve(){            sort(es+1,es+1+m);//按照边权从小到大排序             REP(i,1,n)fa[i]=i;            int res=0,cnt=0;            REP(i,1,m){                int x=es[i].from,y=es[i].to;                int fx=Find(x),fy=Find(y);                if(fx!=fy){                    fa[fy]=fx;                    res+=es[i].cost;                    cnt++;                    if(cnt==n-1)break;                 }            }        }    }Kruskai;

小结:享受能敲到最小生成树的题目吧…