[二分匹配]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 ...
随机推荐
- Android res资源文件夹的知识积累
Android的开发框架耦合性还是比较低的,逻辑和布局被原生分开了.在Eclipse一般代码写在src文件夹下,资源等写在res文件夹下. drawable文件夹:该文件夹有很多变种,主要是为了适配A ...
- [转]Windows Shell 编程 第四章 【来源 http://blog.csdn.net/wangqiulin123456/article/details/7987933】
第四章 文件的本质 以前,所有文件和目录都有一个确定的属性集:时间,日期,尺寸,以及表示‘只读的’,‘隐藏的,‘存档的’,或‘系统的’状态标志.然而,Windos95(及后来的WindowsNT4.0 ...
- windows server 2003 负载平衡的详细设置步骤(转载)
声明:本文为转载. 当把一台服务器(包括Web服务器.FTP服务器或者流媒体服务器等等)放入网络中之后,随着客户端数量的不断增加,人们往往需要功能更强大.处理速度更快的服务器.为了解决这个问题,如果将 ...
- 简单jquery 鼠标悬停提示效果
记得自己引入jq插件哦~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- (CodeForces 510C) Fox And Names 拓扑排序
题目链接:http://codeforces.com/problemset/problem/510/C Fox Ciel is going to publish a paper on FOCS (Fo ...
- Menu bar missing from ClearCase Explorer
See following links: Menu bar missing from ClearCase Explorer Understanding the Rational ClearCase E ...
- [cocos2d-x 2.0.4][iOS7]不能全屏问题
本篇文章由:http://www.sollyu.com/cocos2d-x-2-0-4-ios7-cannot-be-full-screen-problem/ 说明 ▼ 症状如下图 解决 打开你工程的 ...
- ImageButton如何让图片按比例缩放不被拉伸
了解 在安卓的界面XML中,ImageButton有这样一个属性android:scaleType,他干嘛的? ImageView的Scaletype决定了图片在View上显示时的样子,如进行何种比例 ...
- 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]
作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:定义Fibonacci数列如下: / 0 n=0 f(n)= ...
- Android_时间服务
接着上一节,这次我查看了Android的时间服务,觉得帮助很大,解决了我很多疑问,下面我就自己总结了一下,加深了自己的印象,好记性不如烂笔头,还真讲得很不错,收下吧?看下图如何利用线程更新UI组件 重 ...