标签:
朱刘算法 最小树形图无根树:
建立一个虚拟的根节点,向所有节点连边,权值为其他所有边的权值和+1
在求最小树形图的时候,记录和虚拟的根相连的是哪个节点
在这题中,边是从小往大加的所以直接记录的是相连的是第几号边....
3 1 0 1 1 4 4 0 1 10 0 2 10 1 3 20 2 3 30
impossible 40 0
/* *********************************************** Author :CKboss Created Time :2015年07月07日 星期二 16时55分48秒 File Name :HDOJ2121.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; const int INF = 0x3f3f3f3f; const int maxn=1100; int n,m; struct Edge { int u,v,cost; }edge[maxn*maxn]; int pre[maxn],id[maxn],vis[maxn]; int in[maxn]; int Root; int zhuliu(int root,int n,int m,Edge edge[]) { int res=0; int v; while(true) { for(int i=0;i<n;i++) in[i]=INF; for(int i=0;i<m;i++) { if(edge[i].u!=edge[i].v&&edge[i].cost<in[edge[i].v]) { pre[edge[i].v]=edge[i].u; in[edge[i].v]=edge[i].cost; if(edge[i].u==root) Root=i; } } for(int i=0;i<n;i++) if(i!=root&&in[i]==INF) return -1; int tn=0; memset(id,-1,sizeof(id)); memset(vis,-1,sizeof(vis)); in[root]=0; for(int i=0;i<n;i++) { res+=in[i]; v=i; while(vis[v]!=i&&id[v]==-1&&v!=root) { vis[v]=i; v=pre[v]; } if(v!=root&&id[v]==-1) { for(int u=pre[v];u!=v;u=pre[u]) id[u]=tn; id[v]=tn++; } } if(tn==0) break; for(int i=0;i<n;i++) { if(id[i]==-1) id[i]=tn++; } for(int i=0;i<m;i++) { v=edge[i].v; edge[i].u=id[edge[i].u]; edge[i].v=id[edge[i].v]; if(edge[i].u!=edge[i].v) edge[i].cost-=in[v]; } n=tn; root=id[root]; } return res; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d%d",&n,&m)!=EOF) { int sum=0; int en=0; Root=INF; for(int i=0;i<m;i++) { scanf("%d%d%d",&edge[en].u,&edge[en].v,&edge[en].cost); sum+=edge[en++].cost; } sum++; /// link with virtual root for(int i=0;i<n;i++) { edge[en].u=n; edge[en].v=i; edge[en].cost=sum; en++; } int lens = zhuliu(n,n+1,en,edge); if(lens>=2*sum||lens==-1) puts("impossible"); else printf("%d %d\n",lens-sum,Root-m); putchar(10); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDOJ 2121 Ice_cream’s world II 最小树形图无根树
标签:
原文地址:http://blog.csdn.net/ck_boss/article/details/46793641