POJ2584 T-Shirt Gumbo 二分图匹配(网络流)
#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 二分图匹配(网络流)的更多相关文章
- LOJ 2548 「JSOI2018」绝地反击 ——二分图匹配+网络流手动退流
题目:https://loj.ac/problem/2548 如果知道正多边形的顶点,就是二分答案.二分图匹配.于是写了个暴力枚举多边形顶点的,还很愚蠢地把第一个顶点枚举到 2*pi ,其实只要 \( ...
- cogs_396_魔术球问题_(最小路径覆盖+二分图匹配,网络流24题#4)
描述 http://cojs.tk/cogs/problem/problem.php?pid=396 连续从1开始编号的球,按照顺寻一个个放在n个柱子上,\(i\)放在\(j\)上面的必要条件是\(i ...
- P3386 【模板】二分图匹配 -网络流版
二分图匹配 题目背景 二分图 感谢@一扶苏一 提供的hack数据 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+ ...
- POJ-3041-建图/二分图匹配/网络流
Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26351 Accepted: 14254 Descr ...
- BZOJ 1191: [HNOI2006]超级英雄Hero(二分图匹配)
云神说他二分图匹配从来都是用网络流水过去的...我要发扬他的精神.. 这道题明显是二分图匹配.网络流的话可以二分答案+最大流.虽然跑得很慢.... -------------------------- ...
- 【wikioi】1922 骑士共存问题(网络流/二分图匹配)
用匈牙利tle啊喂?和网络流不都是n^3的吗(匈牙利O(nm), isap O(n^2m) 但是isap实际复杂度很优的(二分图匹配中,dinic是O(sqrt(V)*E),不知道isap是不是一样. ...
- cogs_14_搭配飞行员_(二分图匹配+最大流,网络流24题#01)
描述 http://cojs.tk/cogs/problem/problem.php?pid=14 有一些正飞行员和副飞行员,给出每个正飞行员可以和哪些副飞行员一起飞.一架飞机上必须一正一副,求最多多 ...
- 【BZOJ4554】游戏(二分图匹配,网络流)
[BZOJ4554]游戏(二分图匹配,网络流) 题解 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能炸到对手, ...
- 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...
随机推荐
- Ubuntu 桌面歌词
Ubuntu 有个用来显示歌词软件叫 osd-lyrics. 这个软件的强大之处在于他可以和各种播放器配合, 并且可以自动下载歌词. 自从升级到14.04后不能用了,便以为该软件被废弃了. 无意中发现 ...
- page.Response.WriteFile(newpath);
page.Response.Clear(); page.Response.ClearHeaders(); page.Response.Buffer = fa ...
- haproxy实现mysql slave负载均衡
简单画一个图: 一.服务器规划 192.168.116.132 (master) -->写操作 192.168.116.129 (slave1) -->读操作 192.168.116. ...
- Light OJ 1051 - Good or Bad
题目大意: 给你一个字符串,字符串由大写字母和‘?’组成,大写字母可以变成任意一个字母.现在我们定义字符串, 如果有超过三个连续的元音字母或者连续五个辅音字母,那么我们称这个字符串是“BAD”,否则称 ...
- 利用MVC的过滤器实现url的参数加密和解密
最近在与一个IOS应用做接口对接,之前一直都没有遇到什么很大的问题,但是有一天发现可以通过软件解析app的url,然后直接通过url的拼接修改接口数据,这一下使得数据的安全性和准确性都降低了,于是就想 ...
- sql2005中如何启用SA账号
如下图
- Google桌面搜索引擎
本博文的主要内容有 .Google桌面搜索引擎的下载 .Google桌面搜索引擎的安装 .Google桌面搜索引擎的使用 1.Google桌面搜索引擎的下载 http://download.csd ...
- Treasure Hunt - POJ 1066(线段相交判断)
题目大意:在一个正方形的迷宫里有一些交错墙,墙的两端都在迷宫的边缘墙上面,现在得知迷宫的某个位置有一个宝藏,所以需要砸开墙来获取宝藏(只能砸一段墙的中点),问最少要砸开几面墙. 分析:这个题意刚开 ...
- 网络子系统41_inet_peer平衡二叉树的删除
//1.p存在左孩子,则使用p的左孩子的最右孩子替换p,然后重平衡树 //2.p不存在左孩子,则使用p的右孩子替换p,然后重平衡树 1.1 static void unlink_from_pool(s ...
- Windows版本搭建安装React Native环境配置及相关问题
此文档整理参考地址: http://www.lcode.org/%E5%8F%B2%E4%B8%8A%E6%9C%80%E8%AF%A6%E7%BB%86windows%E7%89%88%E6%9C% ...