标签:string cost acm size return ant define auth show
http://acm.hdu.edu.cn/showproblem.php?pid=2121
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
#include<cstdio> #include<cstring> #define N 1005 #define M 10005 #define inf 2e9 using namespace std; struct node { int u,v,w; }e[M+N]; int in[N],pre[N],vis[N],col[N],id[N]; int ROOT; int n,m; int directed_MST() { int tot=n+1,root=0,ans=0,cirnum=0,to; while(1) { for(int i=0;i<tot;i++) in[i]=inf; for(int i=1;i<=m;i++) if(e[i].u!=e[i].v && in[e[i].v]>e[i].w) { in[e[i].v]=e[i].w; pre[e[i].v]=e[i].u; if(e[i].u==root) ROOT=i; } cirnum=0; memset(vis,-1,sizeof(vis)); memset(col,-1,sizeof(col)); in[root]=0; for(int i=0;i<tot;i++) { ans+=in[i]; to=i; while(vis[to]!=i && col[to]==-1 && to!=root) { vis[to]=i; to=pre[to]; } if(to!=root && col[to]==-1) { for(int nt=pre[to];nt!=to;nt=pre[nt]) col[nt]=cirnum; col[to]=cirnum++; } } if(!cirnum) return ans; for(int i=0;i<tot;i++) if(col[i]==-1) col[i]=cirnum++; for(int i=1;i<=m;i++) { to=e[i].v; e[i].u=col[e[i].u]; e[i].v=col[e[i].v]; if(e[i].u!=e[i].v) e[i].w-=in[to]; } tot=cirnum; root=col[root]; } return ans; } int main() { int tot,sum; int u,v,w,ans,tmp; while(scanf("%d%d",&n,&m)!=EOF) { tot=sum=0; while(m--) { scanf("%d%d%d",&u,&v,&w); if(u!=v) { u++; v++; e[++tot].u=u; e[tot].v=v; e[tot].w=w; sum+=w; } } tmp=tot; for(int i=1;i<=n;i++) { e[++tot].u=0; e[tot].v=i; e[tot].w=sum+1; } m=tot; ans=directed_MST(); if(ans>=2*(sum+1)) printf("impossible\n\n"); else printf("%d %d\n\n",ans-(sum+1),ROOT-tmp-1); } }
标签:string cost acm size return ant define auth show
原文地址:http://www.cnblogs.com/TheRoadToTheGold/p/7435508.html