zoukankan      html  css  js  c++  java
  • 最大流 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;
    }

  • 相关阅读:
    【u026】花园(garden)
    【BZOJ 1040】[ZJOI2008]骑士
    【t100】汤姆斯的天堂梦
    【BZOJ 1038】[ZJOI2008]瞭望塔
    【t096】树的序号
    Java Web整合开发(82)
    2 HTML解析
    T3186 队列练习2 codevs
    T3185 队列练习1 codevs
    T1191 数轴染色 codevs
  • 原文地址:https://www.cnblogs.com/forgood/p/2276104.html
Copyright © 2011-2022 走看看