poj 1149 PIGS 最大流

来源:互联网 发布:简述一个栈算法的功能 编辑:程序博客网 时间:2024/04/28 00:01
#include "stdio.h"   //poj 1149 最大流#include "string.h"#include "queue"using namespace std;#define N 2250#define INF 0x3fffffffstruct node{int u,v,w;int next;}edge[8*N];int n,idx;int start,end;int route[N],maxf[N],head[N],last[N];int EK();int BFS();void init();void adde(int u,int v,int w);void addedge(int u,int v,int w);int MIN(int x,int y){ return x<y?x:y;}int main(){int m,k;int i,j;int u,v,w,Case;while(scanf("%d %d",&m,&k)!=-1){init();start = 0;  //超级源点end = m+k+1;  //超级汇点for(n=1;n<=m;n++){scanf("%d",&w);adde(start,n,w);last[n] = n;}n=m;for(i=1;i<=k;i++){n++;scanf("%d",&Case);while(Case--){scanf("%d",&v);adde(last[v],n,INF);last[v] = n;}scanf("%d",&w);adde(n,end,w);}int ans = EK();printf("%d\n",ans);}return 0;}void init(){idx = 0;memset(head,-1,sizeof(head));}void adde(int u,int v,int w){addedge(u,v,w);addedge(v,u,0);}void addedge(int u,int v,int w){edge[idx].u = u;edge[idx].v = v;edge[idx].w = w;edge[idx].next = head[u];head[u] = idx;idx++;}int EK(){int ans=0,kejia;int x,y;while(kejia = BFS()){ans += kejia;y = route[end];while(y!=-1){x = y^1;edge[y].w -= kejia;edge[x].w += kejia;y = route[edge[y].u];}}return ans;}int BFS(){int i;int x,y;memset(route,-1,sizeof(route));for(i=0;i<N;i++)maxf[i] = INF;route[0] = 0;queue<int> q;q.push(start);while(!q.empty()){x = q.front();q.pop();for(i=head[x];i!=-1;i=edge[i].next){y = edge[i].v;if(route[y]==-1 && edge[i].w>0){maxf[y] = MIN(maxf[x],edge[i].w);route[y] = i;q.push(y);}}}route[0] = -1;if(route[end]==-1) return 0;return maxf[end];}//http://www.cnblogs.com/rainydays/archive/2011/08/27/2155710.html

原创粉丝点击