pku 2987 Firing

来源:互联网 发布:对大数据的理解和认识 编辑:程序博客网 时间:2024/06/13 22:19

 http://poj.org/problem?id=2987

最小闭合权回路,详见周伯涛的论文

#include<stdio.h>#include<string.h>const __int64 inf=0x3f3f3f3f3f3f3f3f;#define N 5005#define E 155000int num,e,head[N];int dep[N],que[N],cur[N];struct node{int x,y;int nxt;__int64 c;}edge[E];void addedge(int u,int v,__int64 c){edge[e].x=u;edge[e].y=v;edge[e].nxt=head[u];edge[e].c=c;head[u]=e++;edge[e].x=v;edge[e].y=u;edge[e].nxt=head[v];edge[e].c=0;head[v]=e++;}__int64 maxflow(int s,int t){int i,j,k,front,rear,top;__int64 res=0,min;while(1){memset(dep,-1,sizeof(dep));front=0;rear=0;que[rear++]=s;dep[s]=0;while(front!=rear){i=que[front++];for(j=head[i];j!=-1;j=edge[j].nxt)if(edge[j].c&&dep[edge[j].y]==-1){dep[edge[j].y]=dep[i]+1;que[rear++]=edge[j].y;}}if(dep[t]==-1)break;memcpy(cur,head,sizeof(head)); for(i=s,top=0;;){if(i==t){min=inf;for(k=0;k<top;k++)if(min>edge[que[k]].c){min=edge[que[k]].c;front=k;}for(k=0;k<top;k++){edge[que[k]].c-=min;edge[que[k]^1].c+=min;}res+=min;i=edge[que[top=front]].x;}for(j=cur[i];cur[i]!=-1;j=cur[i]=edge[cur[i]].nxt)if(dep[edge[j].y]==dep[i]+1&&edge[j].c)break;if(cur[i]!=-1){que[top++]=cur[i];i=edge[cur[i]].y;}else{if(top==0)break;dep[i]=-1;i=edge[que[--top]].x;}}}return res;}char vis[N];void dfs(int u){int i;vis[u]=1;num++;for(i=head[u];i!=-1;i=edge[i].nxt)if(edge[i].c>0&&vis[edge[i].y]==0)dfs(edge[i].y);}int main(){int n,m,i,u,v;while(scanf("%d%d",&n,&m)!=EOF){e=0;memset(head,-1,sizeof(head));__int64 sum=0,c;for(i=1;i<=n;i++){scanf("%I64d",&c);if(c>0){sum+=c;addedge(0,i,c);}elseaddedge(i,n+1,-c);}for(i=0;i<m;i++){scanf("%d%d",&u,&v);addedge(u,v,inf);}__int64 ans=maxflow(0,n+1);memset(vis,0,sizeof(vis));num=-1;dfs(0);printf("%d %I64d\n",num,sum-ans);}return 0;}