最小树形图

/// D-MST
struct Edge
{
    int u,v,w;
};Edge e[maxn];int en;
int in[25100];
int pre[25100],ID[25100],vis[25100];

/// D-MST 点的标号必须是0~N-1,不能改成0~N或1~N
int D_MST(int rt,int n,int m)
{
    int res=0;
    while(1){
        REP(i,0,n-1) in[i]=INF;
        REP(i,1,m){
            int u=e[i].u,v=e[i].v,w=e[i].w;
            if(w<in[v]&&u!=v){
                pre[v]=u;
                in[v]=w;
            }
        }
        REP(i,0,n-1){
            if(i==rt) continue;
            if(in[i]==INF) return -1;
        }
        int cntnode=0;
        memset(ID,-1,sizeof(ID));
        memset(vis,-1,sizeof(vis));
        in[rt]=0;
        REP(i,0,n-1){
            res+=in[i];
            int v=i;
            while(vis[v]!=i&&ID[v]==-1&&v!=rt){
                vis[v]=i;
                v=pre[v];
            }
            if(v!=rt&&ID[v]==-1){
                for(int u=pre[v];u!=v;u=pre[u]) ID[u]=cntnode;
                ID[v]=cntnode++;
            }
        }
        if(cntnode==0) break;
        REP(i,0,n-1) if(ID[i]==-1) ID[i]=cntnode++;
        REP(i,1,m){
            int v=e[i].v;
            e[i].u=ID[e[i].u];
            e[i].v=ID[e[i].v];
            if(e[i].u!=e[i].v) e[i].w-=in[v];
        }
        n=cntnode;
        rt=ID[rt];
    }
    return res;
}
View Code