最大流 poj 1149 pigs

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

http://imlazy.ycool.com/post.2059102.html  大牛的见图详解。

#include<iostream>
#include<queue>
using namespace std;
#define INF 0x7fffffff
#define maxn 1100
#define maxe 100010
typedef struct
{
 int v,val,next;
}Edge;
Edge e[maxe];
int idx,S,T;
int bild[maxn],h[maxn],pre[maxn],pig[maxn];

bool bfs()
{
 int i,v,val,u;
 queue<int>Q;
 memset(h,-1,sizeof(h));
 Q.push(S),h[S]=0;
 while(!Q.empty())
 {
  u=Q.front(),Q.pop();
  for(i=pre[u];i!=-1;i=e[i].next)
  {
   v=e[i].v;
   val=e[i].val;
   if(val>0&&h[v]==-1)
   {
    h[v]=h[u]+1;
    if(v==T) return true;
    Q.push(v);
   }
  }
 }
 return false;
}

int MIN(int a,int b) { return a<b?a:b; }
int dfs(int u,int flow)
{
 if(u==T||flow==0) return flow;
 int i,ret,v,ans=0;
 for(i=pre[u];i!=-1;i=e[i].next)
 {
  v=e[i].v;
  if(e[i].val>0&&h[v]==h[u]+1)
  {
   ret=dfs(v,MIN(flow,e[i].val));
   if(ret>0)
   {
    e[i].val-=ret;
    e[i^1].val+=ret;
    ans+=ret;
    flow-=ret;
   }
  }
 }
 return ans;
}

void dinic()
{
 int ans=0;
 while(bfs())
  ans+=dfs(S,INF);
 printf("%d\n",ans);
}

void add(int from,int to,int valT,int valF)
{
 e[idx].v=to;
 e[idx].val=valT;
 e[idx].next=pre[from];
 pre[from]=idx++;

 e[idx].v=from;
 e[idx].val=valF;
 e[idx].next=pre[to];
 pre[to]=idx++;
}

int main()
{
 int m,n;
 int i,a,k,j;
 while(scanf("%d%d",&m,&n)==2)
 {
  for(i=1;i<=m;i++) scanf("%d",&pig[i]);
  memset(bild,0,sizeof(bild)),memset(pre,-1,sizeof(pre));
  S=0,T=n+1,idx=0;
  for(i=1;i<=n;i++)
  {
   scanf("%d",&a);
   for(j=1;j<=a;j++)
   {
    scanf("%d",&k);
    if(bild[k]) add(bild[k],i,INF,0);
    else
     add(S,i,pig[k],0);
    bild[k]=i;
   }
   scanf("%d",&a);
   add(i,T,a,0);
  }
  dinic();
 }
 return 0;
}

 

posted @ 2011-12-04 22:00  forgood  阅读(145)  评论(0编辑  收藏  举报