#include <cstdio>
 #include <cstring>
 #include <algorithm>

 const int inf=0x3f3f3f3f;
 ;

 struct Edge
 {
     int to;
     int next;
     int capacity;

     void assign(int t,int n,int c)
     {
         to=t; next=n; capacity=c;
     }
 };

 Edge edgeList[];
 ];
 ;

 inline void init()
 {
     edgeCnt=;
     memset(head,-,sizeof(head));
 }

 ];
 int X;

 inline int idx(char s)
 {
     switch(s)
     {
     ;
     ;
     ;
     ;
     ;
     ;
     }
 }

 inline void addEdge(int v1,int v2,int c)
 {
     edgeList[edgeCnt].assign(v2,head[v1],c);
     head[v1]=edgeCnt++;
     edgeList[edgeCnt].assign(v1,head[v2],);
     head[v2]=edgeCnt++;
 }

 bool input()
 {
     scanf("%s",cmd);
     ]=='E') return false;

     scanf("%d",&X);
     ;i<=X+;i++)
     {
         scanf("%s",cmd);
         ]);
         ]);
         for(int j=sm;j<=lg;j++) addEdge(j,i,inf);
         addEdge(i,sink,);
     }
     ;i<=;i++)
     {
         int n; scanf("%d",&n);
         addEdge(,i,n);
     }
     scanf("%s",cmd);
     return true;
 }

 ];

 #include <queue>

 int bfs()
 {
     memset(dist,,sizeof(dist));
     dist[]=;

     std::queue<int> __bfs;
     __bfs.push();

     while(!__bfs.empty())
     {
         int cur=__bfs.front();
         __bfs.pop();

         ;e=edgeList[e].next)
         {
             int __to=edgeList[e].to;
             if(edgeList[e].capacity && !dist[__to])
             {
                 dist[__to]=dist[cur]+;
                 __bfs.push(__to);
             }
         }
     }
     return dist[sink];
 }

 int dinic_aux(int cur,int flow)
 {
     if(cur==sink) return flow;

     ;
     ;
     ;e=edgeList[e].next)
     {
         int __to=edgeList[e].to;
          && edgeList[e].capacity)
         {
             temp=dinic_aux(__to,std::min(flow,edgeList[e].capacity));
             res+=temp;
             flow-=temp;
             edgeList[e].capacity-=temp;
             edgeList[e^].capacity+=temp;
         }
     }
     return res;
 }

 inline int dinic()
 {
     ;
     ,inf);
     return res;
 }

 const char success[]="T-shirts rock!";
 const char fail[]="I'd rather not wear a shirt anyway...";

 inline void solve()
 {
     bool proc=true;
     while(proc)
     {
         init();
         proc=input();
         if(proc) printf("%s\n",dinic()==X?success:fail);
     }
 }

 ; }

Using Dinic Algorithm

这道题有两种解决思路:

(1)拆点。将n件同样尺码的T恤拆成n个节点,然后对于每一个分离的节点向对应的人连边

  效率比较低,点的个数最大有可能达到100以上

(2)网络流。建模的基本思想与一般二分图匹配的网络流建模相同,只是从源点向T恤尺码代表的节点连边时,载量设为该种T恤的件数

  点的个数不超过30,相对比较高效

Appendix:二分图匹配的网络流建模:

约定二分图的两部分记作A和B

设立一个源点和汇点。源点同A中所有点连边,载量设为1(表示该点只能在匹配中被选中一次);汇点同B中所有点连边,载量也设为1

二分图中原来的边保留,令其方向为A→B,载量为任意正整数

对于网络流问题,边表是个很不错的选择。既能像邻接表那样节约空间,又能方便地记录反向边。

记正向边的标号为2x,那么反向边的标号就是2x+1,访问反向边只需将正向边的标号xor 1

POJ2584 T-Shirt Gumbo 二分图匹配(网络流)的更多相关文章

  1. LOJ 2548 「JSOI2018」绝地反击 ——二分图匹配+网络流手动退流

    题目:https://loj.ac/problem/2548 如果知道正多边形的顶点,就是二分答案.二分图匹配.于是写了个暴力枚举多边形顶点的,还很愚蠢地把第一个顶点枚举到 2*pi ,其实只要 \( ...

  2. cogs_396_魔术球问题_(最小路径覆盖+二分图匹配,网络流24题#4)

    描述 http://cojs.tk/cogs/problem/problem.php?pid=396 连续从1开始编号的球,按照顺寻一个个放在n个柱子上,\(i\)放在\(j\)上面的必要条件是\(i ...

  3. P3386 【模板】二分图匹配 -网络流版

    二分图匹配 题目背景 二分图 感谢@一扶苏一 提供的hack数据 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+ ...

  4. POJ-3041-建图/二分图匹配/网络流

    Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26351   Accepted: 14254 Descr ...

  5. BZOJ 1191: [HNOI2006]超级英雄Hero(二分图匹配)

    云神说他二分图匹配从来都是用网络流水过去的...我要发扬他的精神.. 这道题明显是二分图匹配.网络流的话可以二分答案+最大流.虽然跑得很慢.... -------------------------- ...

  6. 【wikioi】1922 骑士共存问题(网络流/二分图匹配)

    用匈牙利tle啊喂?和网络流不都是n^3的吗(匈牙利O(nm), isap O(n^2m) 但是isap实际复杂度很优的(二分图匹配中,dinic是O(sqrt(V)*E),不知道isap是不是一样. ...

  7. cogs_14_搭配飞行员_(二分图匹配+最大流,网络流24题#01)

    描述 http://cojs.tk/cogs/problem/problem.php?pid=14 有一些正飞行员和副飞行员,给出每个正飞行员可以和哪些副飞行员一起飞.一架飞机上必须一正一副,求最多多 ...

  8. 【BZOJ4554】游戏(二分图匹配,网络流)

    [BZOJ4554]游戏(二分图匹配,网络流) 题解 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能炸到对手, ...

  9. 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...

随机推荐

  1. 查看Mysql执行计划

    使用navicat查看mysql执行计划: 打开profile分析工具: 查看是否生效:show variable like ‘%profil%’; 查看进程:show processlist; 选择 ...

  2. Mac下搭建Eclipse Android开发环境

    之前一直是用windows搞android开发,但windows这个性能也真是让人醉了,终于一狠心,砸锅卖铁买了Mac.然后就开始在Mac上搭建android开发环境, 其实也不麻烦,关键是找准下载地 ...

  3. A Dicey Problem 骰子难题(Uva 810)

    题目描述:https://uva.onlinejudge.org/external/8/810.pdf 把一个骰子放在一个M x N的地图上,让他按照规定滚动,求滚回原点的最短路径. 思路:  记忆化 ...

  4. 自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客

    自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客 自动化运维工具Ansible详细部署

  5. Hadoop Hive概念学习系列之什么是Hive?(一)

    参考  <Hadoop大数据分析与挖掘实战>的在线电子书阅读                   http://yuedu.baidu.com/ebook/d128cf8e33687e21 ...

  6. Conversion between json and object using SBJson lib

    Define two methods in an object class as follows: @interface MyObject : NSObject @property (nonatomi ...

  7. maven怎么引入自定义jar的详细图文教程

    1 首先找到你的maven的配置文件{你maven的路径}\conf\settings.xml,然后打开settings.xml,并修改你存放本地jar路径.如我想把我自己的jar放到C:\Users ...

  8. 初次接触GWT,知识点总括

    初次接触GWT,知识点概括 前言 本人最近开始研究 GWT(Google Web Toolkit) ,现将个人的一点心得贴出来,希望对刚开始接触 GWT的程序员们有所帮助,也欢迎讨论,共同进步. 先说 ...

  9. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言)

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言) 我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决 ...

  10. All About JAVA Maven的安装

    一转眼几个月过去了..真是忙碌的几个月,最近在弄CAS 身份认证系统,新版本的CAS需要使用Maven进行构建,所以还要研究下Maven相关的资料.第一步就是下载安装Maven.根据官方网站的文档很容 ...