题意:给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的更多相关文章

  1. HDU5093——Battle ships(最大二分匹配)(2014上海邀请赛重现)

    Battle ships Problem DescriptionDear contestant, now you are an excellent navy commander, who is res ...

  2. Card Game Cheater(贪心+二分匹配)

    Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. hdu 1528 Card Game Cheater (二分匹配)

    Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. 二分图最大匹配(匈牙利算法) URAL 1721 Two Sides of the Same Coin

    题目传送门 /* 题意:三种人,statements,testdata,anthing.要求两个人能完成s和t两个工作,且rank相差2 二分图匹配:此题学习建图技巧,两个集和内部一定没有边相连,ra ...

  5. TTTTTTTTTTTTTTTTT POJ 2226 草地覆木板 二分匹配 建图

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9754   Accepted: 3618 Desc ...

  6. POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24081   Accepted: 106 ...

  7. [kuangbin带你飞]专题十 匹配问题 二分匹配部分

    刚回到家 开了二分匹配专题 手握xyl模板 奋力写写写 终于写完了一群模板题 A hdu1045 对这个图进行 行列的重写 给每个位置赋予新的行列 使不能相互打到的位置 拥有不同的行与列 然后左行右列 ...

  8. BZOJ 1189 二分匹配 || 最大流

    1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1155  Solved: 420[Submi ...

  9. Kingdom of Obsession---hdu5943(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943 题意:给你两个数n, s 然后让你判断是否存在(s+1, s+2, s+3, ... , s+n ...

随机推荐

  1. Android res资源文件夹的知识积累

    Android的开发框架耦合性还是比较低的,逻辑和布局被原生分开了.在Eclipse一般代码写在src文件夹下,资源等写在res文件夹下. drawable文件夹:该文件夹有很多变种,主要是为了适配A ...

  2. [转]Windows Shell 编程 第四章 【来源 http://blog.csdn.net/wangqiulin123456/article/details/7987933】

    第四章 文件的本质 以前,所有文件和目录都有一个确定的属性集:时间,日期,尺寸,以及表示‘只读的’,‘隐藏的,‘存档的’,或‘系统的’状态标志.然而,Windos95(及后来的WindowsNT4.0 ...

  3. windows server 2003 负载平衡的详细设置步骤(转载)

    声明:本文为转载. 当把一台服务器(包括Web服务器.FTP服务器或者流媒体服务器等等)放入网络中之后,随着客户端数量的不断增加,人们往往需要功能更强大.处理速度更快的服务器.为了解决这个问题,如果将 ...

  4. 简单jquery 鼠标悬停提示效果

    记得自己引入jq插件哦~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  5. (CodeForces 510C) Fox And Names 拓扑排序

    题目链接:http://codeforces.com/problemset/problem/510/C Fox Ciel is going to publish a paper on FOCS (Fo ...

  6. Menu bar missing from ClearCase Explorer

    See following links: Menu bar missing from ClearCase Explorer Understanding the Rational ClearCase E ...

  7. [cocos2d-x 2.0.4][iOS7]不能全屏问题

    本篇文章由:http://www.sollyu.com/cocos2d-x-2-0-4-ios7-cannot-be-full-screen-problem/ 说明 ▼ 症状如下图 解决 打开你工程的 ...

  8. ImageButton如何让图片按比例缩放不被拉伸

    了解 在安卓的界面XML中,ImageButton有这样一个属性android:scaleType,他干嘛的? ImageView的Scaletype决定了图片在View上显示时的样子,如进行何种比例 ...

  9. 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]

    作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:定义Fibonacci数列如下: /  0                      n=0 f(n)=      ...

  10. Android_时间服务

    接着上一节,这次我查看了Android的时间服务,觉得帮助很大,解决了我很多疑问,下面我就自己总结了一下,加深了自己的印象,好记性不如烂笔头,还真讲得很不错,收下吧?看下图如何利用线程更新UI组件 重 ...