1891: 丘比特的烦恼 - BZOJ
Description
随着社会的不断发展,人与人之间的感情越来越功利化。最近,爱神丘比特发现,爱情也已不再是完全纯洁的了。这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭。于是丘比特千里迢迢远赴中国,找到了掌管东方人爱情的神——月下老人,向他求教。月下老人告诉丘比特,纯洁的爱情并不是不存在,而是他没有找到。在东方,人们讲究的是缘分。月下老人只要做一男一女两个泥人,在他们之间连上一条红线,那么它们所代表的人就会相爱——无论他们身处何地。而丘比特的爱情之箭只能射中两个距离相当近的人,选择的范围自然就小了很多,不能找到真正的有缘人。丘比特听了月下老人的解释,茅塞顿开,回去之后用了人间的最新科技改造了自己的弓箭,使得丘比特之箭的射程大大增加。这样,射中有缘人的机会也增加了不少。情人节(Valentine's day)的午夜零时,丘比特开始了自己的工作。他选择了男女各N位,感应到他们互相之间是否有缘分。稍稍思考后,他发现恰好可以发现射出N支神箭,使每个人都找到自己的有缘人。正当他为自己的发现兴奋不已,准备射箭时,突然想到,自己只感应了是否有缘分,而没考虑缘分的大小。若是拘泥于射N支神箭,却使得某些有天地良缘的不能终成眷属,或勉强把某些只有猿粪的男女撮合在一起,便不合自己的本意了。但是,把每对男女再感应一次太耗时间,于是丘比特只好求助于你了。 Your Task 告诉你他们之间的缘分,请你找出,在射出N支神箭的前提下,哪些对有缘人一定会在一起,而哪些对有缘人一定会分开。
Input
第一行N M,表示人数与有缘人的对数接下来M行,每行X Y表示第X个男子与第Y个女子有缘分 N<=200000,M<=600000
Output
按输入顺序,对于每对有缘人输出一个数若该对有缘人一定在一起则输出1,若一定分开输出2,否则输出0
Sample Input
3 6
1 1
2 2
3 3
1 2
2 1
3 1
Sample Output
001002
题解:http://blog.csdn.net/pouy94/article/details/6423218
打了好久,终于打出来了
首先我们要求出这个题的一个完备匹配,然后再做第二问(第二问的做法请见bzoj2140: 稳定婚姻)
现在就是要做第一问,n<=200000,m<=600000丧心病狂
但是还是可以做的,因为匈牙利是有优化的就是像dinic一样(虽然我没打过)先标距离标号,然后多路增广,增广时只走标号加1的点(每次多路增广前清空vis数组,多路增广时vis数组不要清空,要不然就不是多路增广,一开始我就错这里了,结果第一个点就超时,不要问我为什么知道,我是不会告诉你我为了测试这个把输出故意搞错,就是一定WA的那种)
const
maxn=;
maxm=;
var
d,first,flag,a:array[..maxn*]of longint;
last,next,ans:array[..maxm*]of longint;
n,m,p,tot,time:longint; procedure insert(x,y:longint);
begin
inc(tot);
last[tot]:=y;
next[tot]:=first[x];
first[x]:=tot;
end; function find(x:longint):boolean;
var
i:longint;
begin
i:=first[x];
while i<> do
begin
if (flag[last[i]]<>time) and (d[x]+=d[last[i]]) then
begin
flag[last[i]]:=time;
if (a[last[i]]=) or (find(a[last[i]])) then
begin
a[last[i]]:=x;
a[x]:=last[i];
exit(true);
end;
end;
i:=next[i];
end;
exit(false);
end; var
q:array[..maxn*]of longint; procedure spfa;
var
i,l,r:longint;
begin
l:=;
r:=;
for i:= to *n do
d[i]:=-;
for i:= to n do
if a[i]= then
begin
inc(r);
q[r]:=i;
d[i]:=;
end;
while l<=r do
begin
if q[l]<=n then
begin
i:=first[q[l]];
while i<> do
begin
if d[last[i]]=- then
begin
d[last[i]]:=d[q[l]]+;
if a[last[i]]> then
begin
inc(r);
q[r]:=last[i];
end;
end;
i:=next[i];
end;
end
else
begin
inc(r);
q[r]:=a[q[l]];
d[a[q[l]]]:=d[q[l]]+;
end;
inc(l);
end;
end; procedure init;
var
i,x,y:longint;
begin
read(n,m);
for i:= to m do
begin
read(x,y);
insert(x,y+n);
insert(y+n,x);
end;
while p<n do
begin
spfa;
inc(time);
for i:= to n do
if a[i]= then
if find(i) then inc(p);
end;
end; var
dfn,low,c,s:array[..maxn*]of longint;
cnt,t:longint; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; procedure dfs(x:longint);
var
i:longint;
begin
inc(t);
dfn[x]:=t;
low[x]:=t;
flag[x]:=time;
inc(tot);
s[tot]:=x;
i:=first[x];
while i<> do
begin
if (a[x]=last[i]) xor (x>n) then
begin
if dfn[last[i]]= then
begin
dfs(last[i]);
low[x]:=min(low[x],low[last[i]]);
end
else
if flag[last[i]]=time then low[x]:=min(low[x],low[last[i]]);
end;
i:=next[i];
end;
if dfn[x]=low[x] then
begin
inc(cnt);
while s[tot+]<>x do
begin
flag[s[tot]]:=time-;
c[s[tot]]:=cnt;
dec(tot);
end;
end;
end; procedure tarjan;
var
i:longint;
begin
for i:= to n do
if dfn[i]= then
begin
inc(time);
t:=;
tot:=;
dfs(i);
end;
end; procedure print;
var
i,j:longint;
begin
for i:= to n do
begin
j:=first[i];
while j<> do
begin
if c[i]<>c[last[j]] then
begin
if a[i]=last[j] then ans[(j+)>>]:=
else ans[(j+)>>]:=;
end;
j:=next[j];
end;
end;
for i:= to m do
write(ans[i]);
end; begin
init;
tarjan;
print;
end.
1891: 丘比特的烦恼 - BZOJ的更多相关文章
- KM算法及其优化的学习笔记&&bzoj2539: [Ctsc2000]丘比特的烦恼
感谢 http://www.cnblogs.com/vongang/archive/2012/04/28/2475731.html 这篇blog里提供了3个链接……基本上很明白地把KM算法是啥讲清楚 ...
- 图论(KM算法):COGS 290. [CTSC2008] 丘比特的烦恼
290. [CTSC2008] 丘比特的烦恼 ★★★ 输入文件:cupid.in 输出文件:cupid.out 简单对比 时间限制:1 s 内存限制:128 MB 随着社会的不断发展, ...
- BZOJ2539: [Ctsc2000]丘比特的烦恼
BZOJ2539: [Ctsc2000]丘比特的烦恼 Description 随着社会的不断发展,人与人之间的感情越来越功利化. 最近,爱神丘比特发现,爱情也已不再是完全纯洁的了. 这使得丘比特很是苦 ...
- cogs 290. [CTSC2000] 丘比特的烦恼
290. [CTSC2000] 丘比特的烦恼 ★★★ 输入文件:cupid.in 输出文件:cupid.out 简单对比时间限制:1 s 内存限制:128 MB 随着社会的不断发展,人 ...
- bzoj2539 丘比特的烦恼、黑书P333 (最优二分图匹配)
丘比特的烦恼 题目描述 Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女, ...
- 【刷题】BZOJ 2539 [Ctsc2000]丘比特的烦恼
Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭.于是 ...
- BZOJ 2539: [Ctsc2000]丘比特的烦恼
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 695 Solved: 260[Submit][Status][Discuss] Description ...
- BZOJ 3280: 小R的烦恼 & BZOJ 1221: [HNOI2001] 软件开发
3280: 小R的烦恼 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 399 Solved: 200[Submit][Status][Discuss ...
- [CTSC2000]丘比特的烦恼
Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭.于是 ...
随机推荐
- 【学习笔记】【C语言】变量的内存分析
计算机中的内存是以字节为单位的存储空间.内存的每一个字节都有一个唯一的编号,这个编号就称为地址.就好像酒店是以房间为单位的,每个房间都有一个唯一的房号,我们根据房号就能找到对应的房间. 1. 变量的存 ...
- C语言知识总结(3)
数组 数组的特点: 只能存放一种类型的数据,比如int类型的数组.float类型的数组 里面存放的数据称为“元素” 初始化方式 ] = {, , }; ] = {,}; , , }; ] = {[]= ...
- c#实现数据集合转换为csv文本
需求 1.将一个数据集合导出到一个csv文件中,集合类型可以视为 List<T>,T为任意类型,T包含多个属性,可指定部分属性进行导出 2.软件中有多种不同类型的数据类型需要进行导出 需求 ...
- Jquery 学习二
一.事件编程 1.基本事件(以方法形式存在的) 基本语法: 原生Javascript代码中的事件绑定方式: DOM对象.事件 = 事件的处理程序 jQuery代码中的事件绑定方式: jQuery对 ...
- java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问
在java中,如果类里面的变量是声明了private的,那么只能在被类中访问,外界不能调用,如果是protected类型的,只能在子类或本包中调用,俗话说没有不透风的墙.但是可以利用java中的反射从 ...
- Silverlight引用WebService时取消对ServiceReferences.ClientConfig文件的依赖
做过Silverlight项目的朋友都知道一般来说我们在Silverlight项目中都需要引用WebService或是WCF,引用的方式是在Visual Studio窗口中通过“添加服务引用”来添加引 ...
- 去掉影响效率的where 1=1
最近看了篇文章,觉得挺有道理.实际项目中,我们进行sql条件过滤,我们不能确定是不是有条件.也不能确定条件的个数.大多数人会先把sql语句组装为: 这样,如果有其他过滤条件直接加上“and 其他条件” ...
- EF调用存储过程
var objPar1 = new System.Data.Objects.ObjectParameter("ExeResults",typeof(bool)); var objP ...
- opencv 手写选择题阅卷 (二)字符识别
opencv 手写选择题阅卷 (二)字符识别 选择题基本上只需要识别ABCD和空五个内容,理论上应该识别率比较高的,识别代码参考了网上搜索的代码,因为参考的网址比较多,现在也弄不清是参考何处的代码了, ...
- LLVM language 参考手册(译)(4)
函数(Functions) LLVM函数定义由“define” 关键字,一个可选的链接标识,一个可选的可见性模式,一个可选的DLL存储类别,一个可选的调用约定,一个可选的 unnamed_addr 属 ...