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

原创 2012年03月27日 21:55:42

       自己开始构图..各种奇葩..各种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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ 1149 PIGS 迈克卖猪问题 网络流构图+三种AC方法

题目链接:POJ 1149 PIGS PIGS Time Limit: 1000MS   Memory Limit: 10000K Total...

POJ 1149 最大流+构图

点击打开链接 题意:有m个猪圈,n个商人,每个商人会买固定猪圈的猪,在每个商人买完猪后,我可以调整开着门的猪圈的住的个数,可以从其他开着门的猪圈调过来,问n个商人最多能买走多少猪 思路:o(︶︿︶...

poj 1149 PIGS(最大流+经典构图)

PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14578   Accepted: 6479 D...
  • WEYuLi
  • WEYuLi
  • 2013-10-13 09:56
  • 1153

poj1149(最大流,构图较难)

题目链接:http://poj.org/problem?id=1149          大意:有M个猪圈,每个猪圈关着一定数量的猪,作为管理员的Mirko,竟然没有猪圈的钥匙,钥匙在哪呢,有N个顾...

HDU POJ 树状数组 (Binary Indexed Tree) 教程 大牛讲解,超简单~~

poj2481 poj3067 poj2299 poj1195 hdu1541 hdu1166 poj2155 hdu3548 hdu1934 hdu2838

poj 1062 跪求大神帮看,网上大牛的测试数据全过了,然而还是wa。。哭晕

我是以0节点为起始,多设置一个n为终止的。 建的有向图和网上的标算好像方向是全反的,但是我觉得这完全不影响答案啊。 求大神指点!!! 或者有谁有poj数据的?给我自己测测...

poj 3281 (最大流,构图)

题意:每头牛有想吃的食物和饮料,每头牛最多只能吃一种食物和一种饮料,给出牛的个数,食物和饮料的种类数,每头牛想要的食物和饮料的种类。 刚开始想着把牛放中间,从汇点到食物,食物到牛,牛到饮料,饮料到汇...

POJ 1161 Floyd 构图

AC~ 调试了N久的一道题啊~~ 还是英语不行,把题中的变量意义读错了!结果怎么调试怎么不过啊~~悲剧悲剧哦~ 总算是过了~~ ----------------------...

POJ 3126 --Father Christmas flymouse【scc缩点构图 && SPFA求最长路】

Father Christmas flymouse Time Limit: 1000MS   Memory Limit: 131072K Total Submissio...

poj 2536 Gopher II(二分图最大匹配,构图)

Gopher II Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8347   Acce...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)