最小树形图
/// 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; }
没有AC不了的题,只有不努力的ACMER!