非常好的网络流

每个顾客分别用一个结点来表示。

对于每个猪圈的第一个顾客,从源点向他连一条边,容量就是该猪圈里的猪的初始数量

对于每个猪圈,假设有n个顾客打开过它,则对所有整数i∈[1, n),从该猪圈的第i个顾客向第i + 1个顾客连一条边,容量为无穷。

从各个顾客到汇点各有一条边,容量是各个顾客能买的数量上限。

其实很好理解

 const inf=;
type node=record
       from,point,flow,next:longint;
     end;
var p,s,w,h,numh,cur,pre:array[..] of longint;
    v:array[..] of boolean;
    a:array[..,..] of longint;
    edge:array[..] of node;
    ans,z,len,t,i,j,k,x,y,n,m:longint; procedure add(x,y,f:longint);
  begin
    inc(len);
    edge[len].from:=x;
    edge[len].point:=y;
    edge[len].flow:=f;
    edge[len].next:=p[x];
    p[x]:=len;
  end; procedure sap;
  var q,u,i,j,flow,neck,tmp:longint;
  begin
    fillchar(numh,sizeof(numh),);
    fillchar(h,sizeof(h),);
    fillchar(pre,sizeof(pre),);
    numh[]:=t+;
    u:=;
    while h[]<t+ do
    begin
      if u=t then
      begin
        neck:=;
        flow:=inf;
        i:=;
        j:=cur[i];
        while i<>t do
        begin
          if flow>edge[j].flow then
          begin
            flow:=edge[j].flow;
            neck:=i;
          end;
          i:=edge[j].point;
          j:=cur[i];
        end;
        i:=;
        j:=cur[i];
        while i<>t do
        begin
          dec(edge[j].flow,flow);
          inc(edge[j xor ].flow,flow);
          i:=edge[j].point;
          j:=cur[i];
        end;
        ans:=ans+flow;
        u:=neck;
      end;
      q:=-;
      i:=p[u];
      while i<>- do
      begin
        x:=edge[i].point;
        if (edge[i].flow>) and (h[u]=h[x]+) then
        begin
          q:=i;
          break;
        end;
        i:=edge[i].next;
      end;
      if q<>- then
      begin
        cur[u]:=q;
        pre[x]:=u;
        u:=x;
      end
      else begin
        dec(numh[h[u]]);
        if numh[h[u]]= then break;
        tmp:=t+;
        i:=p[u];
        while i<>- do
        begin
          x:=edge[i].point;
          if (edge[i].flow>) then tmp:=min(tmp,h[x]);
          i:=edge[i].next;
        end;
        h[u]:=tmp+;
        inc(numh[h[u]]);
        if u<> then u:=pre[u];
      end;
    end;
  end; begin
  readln(m,n);
  fillchar(p,sizeof(p),);
  len:=-;
  t:=n+;
  for i:= to m do
    read(w[i]);
  for i:= to n do
  begin
    read(y);
    z:=;
    for j:= to y do
    begin
      read(x);
      if v[x]=false then
      begin
        v[x]:=true;
        z:=z+w[x];   //如果多条边连接源点和顾客,那么合并
      end;
      inc(s[x]);
      a[x,s[x]]:=i;
    end;
    if z<> then
    begin
      add(,i,z);
      add(i,,);
    end;
    readln(x);
    add(i,t,x);
    add(t,i,);
  end;
  for i:= to m do
    for j:= to s[i]- do
      for k:=j+ to s[i] do
      begin
        add(a[i,j],a[i,k],inf);
        add(a[i,k],a[i,j],);
      end;
  sap;
  writeln(ans);
end.

poj1149的更多相关文章

  1. POJ1149 PIGS

    想了好久啊...(#-.-) 开始想到m*n个点的构图,明显超时,于是考虑压缩节点个数 我们发现每个猪圈最后被有且只有一个人调整,于是想到对于一个人,连接他能调整的每个猪圈的上一个控制人.(不懂可以开 ...

  2. POJ-1149 PIGS---最大流+建图

    题目链接: https://vjudge.net/problem/POJ-1149 题目大意: M个猪圈,N个顾客,每个顾客有一些的猪圈的钥匙,只能购买这些有钥匙的猪圈里的猪,而且要买一定数量的猪,每 ...

  3. [BZOJ1280][POJ1149]Emmy卖猪pigs

    [BZOJ1280][POJ1149]Emmy卖猪pigs 试题描述 Emmy在一个养猪场工作.这个养猪场有 \(M\) 个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位 ...

  4. POJ1149 PIGS 【最大流 + 构图】

    题目链接:http://poj.org/problem?id=1149 PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

  5. POJ1149 PIGS [最大流 建图]

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20662   Accepted: 9435 Description ...

  6. POJ1149 PIGS (网络流)

                                                                             PIGS Time Limit: 1000MS   M ...

  7. POJ1149 PIGS 【最大流量】

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16555   Accepted: 7416 Description ...

  8. poj1149构图题

     引题解: 这道题目的大意是这样的:⦁ 有 M 个猪圈(M ≤ 1000),每个猪圈里初始时有若干头猪.⦁ 一开始所有猪圈都是关闭的.⦁ 依次来了 N 个顾客(N ≤ 100),每个顾客分别会打开指定 ...

  9. POJ1149(最大流)

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21678   Accepted: 9911 Description ...

随机推荐

  1. [大牛翻译系列]Hadoop(1)MapReduce 连接:重分区连接(Repartition join)

    4.1 连接(Join) 连接是关系运算,可以用于合并关系(relation).对于数据库中的表连接操作,可能已经广为人知了.在MapReduce中,连接可以用于合并两个或多个数据集.例如,用户基本信 ...

  2. android studio引入第三方包记录

    1.添加jar文件 将jar文件复制至app module目录下的libs文件夹下,然后打开app module目录下的build.gradle配置文件,在dependencies项中添加配置命令,这 ...

  3. php删除html标签的三种解决方法

    分享下PHP删除HTMl标签的三种方法. 方法1:直接取出想要取出的标记 <?php //取出br标记 function strip($str) { $str=str_replace(" ...

  4. ShowMask

    <html> <head> <script type="text/javascript"> function showMask(){ var a ...

  5. PythonCrawl自学日志(3)

    2016年9月21日09:21:431.爬虫的抓取周期:(1)首先生成初始请求爬第一个url,并指定一个回调函数被称为与下载这些请求的响应.(2)第一个请求执行通过调用 start_requests( ...

  6. PDF合并

    要求:将多个table导出到一个PDF里,然后打印. 问题分析:要求将四个table放一个PDF打印,四个table的列各不相同,第一个是表头,其他三个是列表,列比表头多很多,如果直接生成一个exce ...

  7. ExtJS 添加图标icon

    extjs控件有两个属性:一个是iconCls:另一个是icon.通过这两个属性可以对控件添加图标 1.直接引用图标路径 icon: '../icons/application_view_detail ...

  8. WP8.1和Win8.1的不同之处

    本文仅是个人见解,如有不足或错误之处欢迎批评指正~ 1.Toast: 创建Toast代码差不多但实现机制及管理上不一样 2.ApplicationData: WP8.1多了一个LocalCacheFo ...

  9. PAT-乙级-1044. 火星数字(20)

    1044. 火星数字(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 火星人是以13进制计数的: 地球人的 ...

  10. 团体程序设计天梯赛-练习集L1-022. 奇偶分家

    L1-022. 奇偶分家 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定N个正整数,请统计奇数和偶数各有多少个? 输入格式 ...