二分图最大匹配模板(pascal)
uoj#78. 二分图最大匹配
从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生。编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr。
有若干个这样的条件:第 vv 个男生和第 uu 个女生愿意结为配偶。
请问这个班级里最多产生多少对配偶?
输入格式
第一行三个正整数,nl,nr,mnl,nr,m。
接下来 mm 行,每行两个整数 v,uv,u 表示第 vv 个男生和第 uu 个女生愿意结为配偶。保证 1≤v≤nl1≤v≤nl,1≤u≤nr1≤u≤nr,保证同一个条件不会出现两次。
输出格式
第一行一个整数,表示最多产生多少对配偶。
接下来一行 nlnl 个整数,描述一组最优方案。第 vv 个整数表示 vv 号男生的配偶的编号。如果 vv 号男生没配偶请输出 00。
样例一
input
2 2 3
1 1
1 2
2 1
output
2
2 1
explanation
11 号男生跟 22 号女生幸福地生活在了一起~
22 号男生跟 11 号女生幸福地生活在了一起~
样例二
input
2 2 2
1 1
2 1
output
1
1 0
explanation
班上一个女神一个女汉子,两个男生都去追女神。一种最优方案是:
11 号男生跟 11 号女生幸福地生活在了一起~
22 号男生孤独终生。= =||
限制与约定
1≤nl,nr≤5001≤nl,nr≤500,1≤m≤2500001≤m≤250000。
时间限制:1s
空间限制:256MB
打个板子玩玩,不料还WA了一次。原因是把队列数组也开成-550~550了。
program rrr(input,output);
const
inf=;
type
etype=record
t,c,next,rev:longint;
end;
var
e:array[..]of etype;
a,cur,d:array[-..]of longint;
q:array[..]of longint;
l,r,i,x,y,j,m,cnt,ans,h,t:longint;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
procedure ins(x,y,c:longint);
begin
inc(cnt);e[cnt].t:=y;e[cnt].c:=c;e[cnt].next:=a[x];a[x]:=cnt;
end;
procedure add(x,y,c:longint);
begin
ins(x,y,c);e[cnt].rev:=cnt+;ins(y,x,);e[cnt].rev:=cnt-;
end;
procedure bfs;
begin
for i:=-l to r+ do d[i]:=-;d[]:=;
h:=;t:=;q[]:=;
while h<t do
begin
inc(h);
i:=a[q[h]];
while i<> do
begin
if (d[e[i].t]=-) and (e[i].c>) then
begin
d[e[i].t]:=d[q[h]]+;
inc(t);q[t]:=e[i].t;
end;
i:=e[i].next;
end;
end;
end;
function dfs(k,f:longint):longint;
var
ans,t,i:longint;
begin
if (k=r+) or (f=) then exit(f);
ans:=;i:=cur[k];
while i<> do
begin
if (d[e[i].t]=d[k]+) and (e[i].c>) then
begin
t:=dfs(e[i].t,min(f,e[i].c));
dec(e[i].c,t);inc(e[e[i].rev].c,t);
inc(ans,t);dec(f,t);
if f= then break;
end;
i:=e[i].next;cur[k]:=i;
end;
if f> then d[k]:=-;
exit(ans);
end;
begin
assign(input,'r.in');assign(output,'r.out');reset(input);rewrite(output);
readln(l,r,m);
fillchar(a,sizeof(a),);cnt:=;
for i:= to l do add(,-i,);
for i:= to m do begin readln(x,y);add(-x,y,); end;
for i:= to r do add(i,r+,);
ans:=;
while true do
begin
bfs;
if d[r+]=- then break;
for i:=-l to r+ do cur[i]:=a[i];
ans:=ans+dfs(,inf);
end;
writeln(ans);
for i:= to l do
begin
j:=a[-i];
while j<> do begin if e[j].c= then break;j:=e[j].next; end;
if j= then write(,' ') else write(e[j].t,' ');
end;
close(input);close(output);
end.
二分图最大匹配模板(pascal)的更多相关文章
- 二分图最大匹配模板【匈牙利;Dinic最大流】
二分图最大匹配模板[匈牙利:Dinic最大流] 匈牙利算法 int n,m; vector<int> map[100010]; int match[100010];//保存匹配的互相点 b ...
- 【HDU 2063】过山车(二分图最大匹配模板题)
题面 RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是,每 ...
- HDU - 1962 二分图最大匹配模板(扑克牌得分最大)
题意: 直接说数据,第一行给定几组数据,每一组数据的第一行是两个人扑克牌分别的数量,第一行是亚当的扑克牌,第二行是夏娃的扑克牌,每一个扑克牌的大小用两个字符来表示,第一个表示是几号扑克牌,第二个表示扑 ...
- Asteroids(二分图最大匹配模板题)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12323 Accepted: 6716 Description Bess ...
- 二分图——多重匹配模板hdu1669
好像多重匹配一般是用网络流来做的.. 这是匈牙利算法的模板:lim是每个组的上界 思路是每个组都可以匹配lim个点,那么当点x遇到的组匹配的点数还没有超过lim时,直接匹配即可 如果已经等于了lim, ...
- HDU 2063 过山车(模板—— 二分图最大匹配问题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2063 解题思路: 二分图最大匹配模板题. AC代码: #include<stdio.h> ...
- HDU 1533:Going Home(KM算法求二分图最小权匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=1533 Going Home Problem Description On a grid map there ...
- POJ 2584 T-Shirt Gumbo 二分图的多重匹配
题目链接:http://poj.org/problem?id=2584 题目大意:有SMLXT五种T恤型号,有N个人,每个人有一个可选的型号区间,你现在要发给N个人每人一条他可以选择的型号的T恤,问能 ...
- BZOJ两水题连发~(BZOJ1854&&BZOJ1191)
前言:两题都是省选题不过水的惊人,且都可以用二分图最大匹配做哎--- 1854: [Scoi2010]游戏 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: ...
随机推荐
- 关于IntelliJ IDEA 创建Maven项目速度慢
在maven的VM Options加上-DarchetypeCatalog=internal参数,如下:
- zabbix3.4 监控路由器报错No Such Instance currently exists at this OID
zabbix 3.4 监控报错No Such Instance currently exists at this OID 1.首先查看监控的路由器的监控项是否报警 监控主机报错出现这个 No Such ...
- Unity新版本VR以及SteamVR基础
一.Unity2018新版本VR Unity 简单VRDemo搭建 Unity环境搭建: PlayerSetting设置如下: 启动虚拟现实驱动,sdk选择OpenVR.HTC Vive只支持Ope ...
- [Unity] unity5.3 assetbundle打包及加载
Unity5.3更新了assetbundle的打包和加载api,下面简单介绍使用方法及示例代码. 在Unity中选中一个prefab查看Inspector窗口,有两个位置可以进行assetbundle ...
- Unity Shader 学习之旅
Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...
- GIT问题(二)——add报错
- yocto-sumo源码解析(八): ProcessServer
从前面章节的论述中,我们知道BitBakeServer实际上是一个ProcessServer,什么是ProcessServer不可不了解. 1. 类的声明: 首先这是一个python的多进程包里面的进 ...
- 高可用OpenStack(Queen版)集群-7.Neutron控制/网络节点集群
参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...
- c++ 整数和字符串的转化
一.string转int的方式 采用最原始的string, 然后按照十进制的特点进行算术运算得到int,但是这种方式太麻烦,这里不介绍了. 采用标准库中atoi函数. "; int a = ...
- 笨办法学Python - 习题3: Numbers and Math
目录 习题 3: 数字和数学计算 算术运算符 加分习题: 我的答案: 总结: 扩展: Python比较运算符 Python赋值运算符 Python位运算符 Python逻辑运算符 Python成员运算 ...