[二分匹配]URAL1721Two Sides of the Same Coin
题意:给n个人,每个人都有3个参数,分别是名字,能做的事(a:statements b:testdate a、b都可以:anything),Rank
要求:一个人只能做一个事件,要两个人Rank相差2才能共同做a、b,问最多能做多少个a、b,并输出 做a人的名字 做b人的名字
很明显是二分匹配 稳定婚姻问题。
一开始按照 能做a的人->能做b的人 建图 怎么都过不了案例。。。
后来发现若是这样建图,对于
1 ab 4
2 a 2
3 b 6
若是这样建图
那么就会有两个匹配:1和3 以及 2和1
为什么不是一个匹配呢?
因为对于稳定婚姻而言 男的 女的 都分别有编号为1到n的人
因此1和3 以及 2和1的含义 (若用这样的建图 用稳定婚姻来解释的话 就是) 1号男人和3号女人 以及 2号男人以及1号女人 <这样看来确实两对>
而对于这个题目 很显然 男女是共用一个编号的
若是按a->b这样建图 实际上来说 并没有“二分”
那么要怎么建图呢?
此题一共就俩限制一个是a->b,另一个是Rank之差为2。那么既然不是前一个,那必定是后一个咯~
所以二分的方法就是:
Rank相差2的不能在同一个集合里
比如Rank为2的为男 那么Rank为4的就要是女的 Rank为6的为男 那么Rank为8的就要是女
那这样分的话 要是规定Rank 6为女(即限制了4为男), 若之前已经规定了Rank 2为男(即限制了4为女) 那不就矛盾了吗?
于是先按照Rank来排个序 再来确定男女两个集合就没问题了~
给一个案例:
a anything
b anything
c anything
d anything
e anything
f anything
代码:(因为是比赛中写的 所以巨丑...)
#include <bits/stdc++.h>
using namespace std;
struct node
{
string name;
bool a, b;
int Rank;
}a[];
bool cmp(node a, node b)
{
return a.Rank<b.Rank;
}
vector<int> v[];
int lef[];
bool t[];
int n;
int fa[];
bool match(int x)
{
for(int i=;i<(int)v[x].size();i++)
if(t[v[x][i]]==)
{
t[v[x][i]]=;
if(lef[v[x][i]]==- || match(lef[v[x][i]]))
{
fa[x]=-, fa[fa[x]]=-;
fa[v[x][i]]=x, fa[x]=v[x][i];
lef[v[x][i]]=x;
return true;
}
}
return false;
}
int solve()
{
int ans=;
memset(lef, -, sizeof(lef));
memset(fa, -, sizeof(fa));
for(int i=;i<=n;i++)
if(v[i].size())
{
memset(t, , sizeof(t));
if(match(i))
ans++;
}
return ans;
}
bool vis[];
bool zz[];
int main()
{
scanf("%d", &n);
for(int i=;i<=n;i++)
{
string s;
cin>>a[i].name>>s;
if(s=="anything")
a[i].a=, a[i].b=;
else if(s=="statements")
a[i].a=, a[i].b=;
else
a[i].a=, a[i].b=;
scanf("%d", &a[i].Rank);
}
for(int i=;i<=n;i++)
v[i].clear();
sort(a+, a+n+, cmp);
memset(zz, , sizeof(zz));
for(int i=;i<=n;i++)
{
if(zz[a[i].Rank-])
continue;
zz[a[i].Rank]=;
}
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(abs(a[i].Rank-a[j].Rank)==)
if((a[i].a== && a[j].b==) || (a[i].b== && a[j].a==))
{
if(zz[a[i].Rank])
v[i].push_back(j);
else if(zz[a[j].Rank])
v[j].push_back(i);
}
printf("%d\n", solve());
memset(vis, , sizeof(vis));
for(int i=;i<=n;i++)
if(fa[i]!=- && fa[fa[i]]==i && !vis[i] && !vis[fa[i]])
{
if(a[i].b== && a[fa[i]].a==)
cout<<a[fa[i]].name<<" "<<a[i].name<<endl;
else
cout<<a[i].name<<" "<<a[fa[i]].name<<endl;
vis[i]=, vis[fa[i]]=;
}
return ;
}
URAL 1721
[二分匹配]URAL1721Two Sides of the Same Coin的更多相关文章
- HDU5093——Battle ships(最大二分匹配)(2014上海邀请赛重现)
Battle ships Problem DescriptionDear contestant, now you are an excellent navy commander, who is res ...
- Card Game Cheater(贪心+二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu 1528 Card Game Cheater (二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 二分图最大匹配(匈牙利算法) URAL 1721 Two Sides of the Same Coin
题目传送门 /* 题意:三种人,statements,testdata,anthing.要求两个人能完成s和t两个工作,且rank相差2 二分图匹配:此题学习建图技巧,两个集和内部一定没有边相连,ra ...
- TTTTTTTTTTTTTTTTT POJ 2226 草地覆木板 二分匹配 建图
Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9754 Accepted: 3618 Desc ...
- POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)
The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24081 Accepted: 106 ...
- [kuangbin带你飞]专题十 匹配问题 二分匹配部分
刚回到家 开了二分匹配专题 手握xyl模板 奋力写写写 终于写完了一群模板题 A hdu1045 对这个图进行 行列的重写 给每个位置赋予新的行列 使不能相互打到的位置 拥有不同的行与列 然后左行右列 ...
- BZOJ 1189 二分匹配 || 最大流
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1155 Solved: 420[Submi ...
- Kingdom of Obsession---hdu5943(二分匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943 题意:给你两个数n, s 然后让你判断是否存在(s+1, s+2, s+3, ... , s+n ...
随机推荐
- 理解JavaScript原型式继承
0.基础 javascript没有类的概念, javascript不需要实例化某个具体类的实例.javascript对象本身可以用来创建对象, 而对象可以继承自其他对象, 这个概念称为原型式继承 每个 ...
- asp:弹出警告框,并重定向的自定义过程
因为制作的需要写了这样一个简单的函数,重定向可以是指定的页.也可以是前一页! 有两个参数:messtr,警告框的信息;urlstr:转向的网页,为""时,返回到前一页! 程序代码 ...
- Unity3d不支持vistual studio2012?用vs2012打开unity c#脚本进行编码的方法。
unity3d是支持vs2010的,但是有很多开发者反应,unity3d中的C#脚本不能用vs2012打开.我想了一下,先进入存放C#脚本的目录,在设置里面C#文件的打开方式,选择用vs2012打开, ...
- jenkins离线安装git插件
jenkins没有默认安装git,当jenkins无法连接外网的话,安装git插件就是一件很麻烦的事,需要自己去下载插件: 往下拉 这边的插件就是需要自己去下载了,在bing下搜索jenkins gi ...
- 动易标签函数position() 应用
Position()返回当前正在被处理的节点的 index 位置.例子://book[position()<=3].结果:选择前三个 book 元素当然在动易标签中,我们不需要这样用,因为用sq ...
- Android系统简介(上):历史渊源
上个月,看到微信的一系列文章,讲到Linux的鼻祖-李纳斯的传记<Just for Fun>, 其人神乎其能, 其人生过程非常有趣,值得每个程序员细细品味. 而实际上,对我而已,虽然做软件 ...
- 转:jQuery对象与dom对象的转换
jQuery对象与dom对象的转换 发布时间:September 20, 2007 分类:JavaScript <新站上线的手记> <Discuz!多附件上传选择框之jQuery版& ...
- 9月18日,SQL学习基础1
数据库管理和应用 Oltp是小型的管理,OLAP是大型的管理 开发的内容如触发器 数据库管理系统(Database Management System,简称为DBMS)是位于用户与操作系统之间的一层数 ...
- as3判断XML是否合法
XML是否合法 在我认为 XML的标签成对 并且根标签外边没有其他东西 以下是合法的 <?xml version="1.0" encoding="utf-8&quo ...
- Java实现HTML代码生成PDF文档
1.IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源. 2.Flying Sauser实现html2pdf,纠错能力差,支 ...