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 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...
随机推荐
- nginx -- nginx平台初探(100%)
初探nginx架构(100%) 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的.那么nginx究竟是怎么样的呢?这一节我们先来初识一下nginx框架吧. nginx在启动后,在un ...
- 转 @RenderBody()和@RenderSection()
强大的Razor引擎 一.Razor基础简介 Razor采用了cshtml后缀的文件名,截图如下: A. 版面布局 从图上看到,新的视图引擎已经没有了Site.Master这种MasterPage了, ...
- 杂项(最小表示法):HZOI 2015 Glass Beads
[题目描述] 给定长度为n(n<=300000)的循环同构的字符串,定义最小表示为该字符串的字典序最小的同构表示,请输出这个表示. [输入格式] 第一行是串的长度,第二行是字符串. [输出格式] ...
- Oracle自动增长的序列号
首先建立序列: Create sequence user_id Increment Start Maxvalue .0E28 Minvalue nocycle Cache Noorder; 然后建立触 ...
- 登录MD5加盐处理
一:解决方案资源管理器截图: 二:operatorDAL.cs代码 using System; using System.Collections.Generic; using System.Linq; ...
- 新学Linux时遇到的一些问题
1.如何进入到Linux的命令终端 (1)按ctrl+alt+t (2)按ctrl+alt+(F1-F6都可以),按ctrl+alt+F7退出 2.按ctrl+alt+(F1-F6)进入命令终端,登录 ...
- 【转】Unity3D NGUI事件 UIEvents
原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:[119706192] 本文链接地址: Unity3D NGUI事件 UIEvents UIEvents-事件系统void OnH ...
- IE的表头固定/表头不动(使用expression)
本文主要介绍在IE浏览器中,实现表头固定的一种方法.这种方法使用到了 IE 浏览器特有的 expression 方法. 表头固定DEMO1 主要代码: <style type="tex ...
- 数据导出到Excel中
自己修改后的一个数据导出到Excel的方法,粘出来与大家共享. 只需要将 System.Web.HttpContext.Current.Response.Charset = ...
- js 中cookie 使用
一个系统有多种 角色, 每一种角色不同权限.后台请求的数据根据权限展示 ,所以要把权限保存在浏览器中. 首先 引入 在页面 <script type="text/javascript& ...