关闭

POJ-1149 参考大牛的构图..

标签: 网络ooc
970人阅读 评论(0) 收藏 举报

       自己开始构图..各种奇葩..各种bug不对...实在不行了...还是看了大牛的构图:

       http://imlazy.ycool.com/post.2059102.html

       核心:  

          每个顾客分别用一个节点来表示。
          对于每个猪圈的第一个顾客,从源点向他连一条边,容量就是该猪圈里的猪的初始数量。如果从源点到一名顾客有多条边,则可以把它们合并成一条,容量相加。
          对于每个猪圈,假设有 n 个顾客打开过它,则对所有整数 i ∈ [1, n),从该猪圈的第 i 个顾客向第 i + 1 个顾客连一条边,容量为 +∞。
         从各个顾客到汇点各有一条边,容量是各个顾客能买的数量上限。

      对大牛真是五体投地..网络流不会构图就相当于不会网络流..但构图又都是如此的巧妙..我怎样才能想到....

      看大牛对这题的构图,开始是从一个具体的直观比较复杂的图..经过一步步简化成抽象但简单的图...这种思维~~学习啊...


Program:

#include<iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<queue>
#define oo 2000000000
using namespace std;
struct node
{
      int x,y,c,next;
}line[50005];
int m,n,M,_link[2005],ans,dis[2005],num,way[2005];
queue<int> myqueue;
bool BFS()
{
      int h,k;
      while (!myqueue.empty()) myqueue.pop();
      memset(dis,0,sizeof(dis));
      dis[0]=1;
      myqueue.push(0);
      while (!myqueue.empty())
      {
            h=myqueue.front();
            myqueue.pop();
            k=_link[h];
            while (k)
            {
                  if (line[k].c && !dis[line[k].y])
                  {
                        dis[line[k].y]=dis[h]+1;
                        myqueue.push(line[k].y);
                  }
                  k=line[k].next;
            }
      }
      return dis[n];
}
bool DFS(int p,int Flow)
{
      int k;
      if (p==n)
      {
            ans+=Flow;
            for (k=1;k<=num;k++)
            {
                   line[way[k]].c-=Flow;
                   m++;
                   line[m].x=line[way[k]].y;
                   line[m].y=line[way[k]].x;
                   line[m].c=Flow;
                   line[m].next=_link[line[m].x];
                   _link[line[m].x]=m;
            }
            return true;
      }
      k=_link[p];
      num++;
      while (k)
      {
            if (line[k].c && dis[line[k].y]-dis[p]==1)
            {
                    way[num]=k;
                    if (DFS(line[k].y,min(Flow,line[k].c))) return true;
            }
            k=line[k].next;
      }
      num--;
      return false;
}
void MaxFlow()
{
      ans=0;
      while (BFS())
      {
            num=0;
            DFS(0,oo);
      }
} 
int main()
{
      freopen("input.txt","r",stdin);
      freopen("output.txt","w",stdout);
      int i,k,h,j,need,sum[1005],who[1005];
      memset(_link,0,sizeof(_link));
      scanf("%d%d",&M,&n);
      for (i=1;i<=M;i++) scanf("%d",&sum[i]);
      memset(who,0,sizeof(who));
      for (i=1;i<=n;i++)
      {
            scanf("%d",&k);
            for (j=1;j<=k;j++) 
            {
                  scanf("%d",&h); 
                  if (!who[h])
                  {
                        who[h]=i;
                        m++;
                        line[m].x=0; line[m].y=i;
                        line[m].c=sum[h];
                        line[m].next=_link[line[m].x];
                        _link[line[m].x]=m;
                  }else
                  {
                        m++;
                        line[m].x=who[h]; line[m].y=i;
                        line[m].c=oo;
                        line[m].next=_link[line[m].x];
                        _link[line[m].x]=m;                             
                  }
            }
            scanf("%d",&need);
            m++;
            line[m].x=i; line[m].y=n+1;
            line[m].c=need; 
            line[m].next=_link[line[m].x];
            _link[line[m].x]=m;
      }     
      n++;
      MaxFlow();
      printf("%d\n",ans);
      return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:686303次
    • 积分:12263
    • 等级:
    • 排名:第1166名
    • 原创:620篇
    • 转载:3篇
    • 译文:0篇
    • 评论:178条
    最新评论