LA 3415 (二分图+最大独立集)
题目大意:一个老师带他的一群学生去旅游。带走的这群学生整体必须满足给出四个条件之一。问最多能带走多少学生。
解题思路:
二分图匹配题。最初我是这样考虑的:符合条件的学生连一条边,求最大匹配*2就行了。
但是问题却没那么简单。最大匹配保证的是多少人被匹配,至于匹配的东西是否有重复,它就不管了。如果简单的最大匹配数*2,那么中间有一些人被匹配了多次,也就是说人多了!
想要得到独立的人数,则必须使用最大独立集做法。
最大独立集的求法很简单:最大匹配的建图方式反过来!意思说完全不符合条件的才连边,在这题里,就是4个条件都不符合要求的学生连一条边。
然后求最大匹配数,ans=n-match/2。
注意这里为啥要除以2,因为你在建图的时候肯定图方便,用了两层for(1..n)判断i和j然后addedge了吧,这样就成了无向图了。
而Hungry是针对有向图的,所以match数成了原来的2倍,所以要除以2。
二分图中使用链式前向星也是挺好的。
#include "string"
#include "cstdio"
#include "cstring"
#include "iostream"
using namespace std;
#define maxn 505
int n,head[maxn],tol,link[maxn];
bool vis[maxn];
struct Edge
{
int next,to;
}e[maxn*maxn];
struct person
{
int h;
char sex;
string music,sport;
}p[];
void addedge(int u,int v)
{
e[tol].to=v;
e[tol].next=head[u];
head[u]=tol++;
}
int abs(int x) {return x<?-x:x;}
bool judge(person a,person b)
{
if(abs(a.h-b.h)<=&&a.sex!=b.sex&&a.music==b.music&&a.sport!=b.sport) return true;
else return false;
}
bool dfs(int u)
{
for(int i=head[u];i!=-;i=e[i].next)
{
int v=e[i].to;
if(vis[v]) continue;
vis[v]=true;
if(!link[v]||dfs(link[v]))
{
link[v]=u;
return true;
}
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
memset(link,,sizeof(link));
memset(head,-,sizeof(head));
tol=;
cin>>n;
for(int i=;i<=n;i++)
{
cin>>p[i].h>>p[i].sex>>p[i].music>>p[i].sport;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j&&judge(p[i],p[j])) {addedge(i,j);}
int match=;
for(int i=;i<=n;i++)
{
memset(vis,false,sizeof(vis));
if(dfs(i)) match++;
}
printf("%d\n",n-match/);
}
}
| 2815370 | neopenx | UVALive 3415 | Accepted | 0 KB | 233 ms | C++ 4.5.3 | 1464 B | 2014-10-04 21:22:11 |
LA 3415 (二分图+最大独立集)的更多相关文章
- HDU 3829 - Cat VS Dog (二分图最大独立集)
题意:动物园有n只猫和m条狗,现在有p个小孩,他们有的喜欢猫,有的喜欢狗,其中喜欢猫的一定不喜欢狗,喜欢狗的一定不喜欢猫.现在管理员要从动物园中移除一些动物,如果一个小孩喜欢的动物留了下来而不喜欢的动 ...
- HDU3829(KB10-J 二分图最大独立集)
Cat VS Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total ...
- BZOJ3175:[TJOI2013]攻击装置(二分图最大独立集)
Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2), ...
- [luoguP3355] 骑士共存问题(二分图最大独立集)
传送门 模型 二分图最大独立集,转化为二分图最大匹配,从而用最大流解决. 实现 首先把棋盘黑白染色,使相邻格子颜色不同. 把所有可用的黑色格子看做二分图X集合中顶点,可用的白色格子看做Y集合顶点. 建 ...
- 洛谷 - P3033 - 牛的障碍Cow Steeplechase - 二分图最大独立集
https://www.luogu.org/fe/problem/P3033 二分图最大独立集 注意输入的时候控制x1,y1,x2,y2的相对大小. #include<bits/stdc++.h ...
- 洛谷 - P5030 - 长脖子鹿放置 - 二分图最大独立集
https://www.luogu.org/problemnew/show/P5030 写的第一道黑色题,图建对了. 隐约觉得互相攻击要连边,规定从奇数行流向偶数行. 二分图最大独立集=二分图顶点总数 ...
- 【Codevs1922】骑士共存问题(最小割,二分图最大独立集转最大匹配)
题意: 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个 ...
- UVA-12083 Guardian of Decency 二分图 最大独立集
题目链接:https://cn.vjudge.net/problem/UVA-12083 题意 学校组织去郊游,选择最多人数,使得任意两个人之间不能谈恋爱 不恋爱条件是高差大于40.同性.喜欢的音乐风 ...
- TopCoder12808 「SRM594Medium」FoxAndGo3 二分图最大独立集
问题描述 一个 \(N \times N\) 围棋棋盘,任意两个白子不相邻,你要加入若干个黑子并提出白子,最大化空格数目. submit 题解 显然最终棋盘的局面不能够一个白子和它周围的空格都是空的, ...
随机推荐
- 他们在军训,我在搞 OI(二)
Day 2 7:26 2016/8/25 新的一天又开始了! 走在上学的路上,抬头看看北京少有的蓝天,太阳的威力不再那么明显,甚至输给了挡住它的云朵.迎面吹来了凉爽的风,夏天的燥热,早已无影无踪. 许 ...
- C#结构体和类的区别
1.不能在结构体中定义默认构造方法: 2.在结构体中的非默认构造方法中,必须对结构体中所有的字段进行初始化,否则将报错. 3.在类中声明字段的同时,可以初始化,字段的值.在结构体中不可以. 4.结构体 ...
- 序列GCD和问题(题目)
序列GCD和 题目描述 Massacc有一个序列$A_1,A_2,A_3,\dots ,A_n$. Popbab说:我要知道这个序列的和$\pmod{1\times10^9+7}$. Massacc在 ...
- shell 生成指定范围随机数与随机字符串 .
shell 生成指定范围随机数与随机字符串 分类: shell 2014-04-22 22:17 20902人阅读 评 ...
- 【OpenStack】OpenStack系列10之Horizon详解
一.参考其他资料即可.可以采用haproxy+apache+horizon方式部署,haproxy/httpd支持ssl.
- 追溯ASP.NET发展史
2000年全新平台的ASP.NET 1.0正式发布,发展速度异常惊人,2003年升级为1.1版本.ASP.NET 1.1发布之后,更加激发了Web应用程序开发人员对ASP.NET的兴趣,并且对网络技术 ...
- EtherCAT报文寻址
EtherCAT通信通过主站发送EtherCAT数据帧读写从站设备的内部存储区实现. 一个EtherCAT网段相当于一个以太网设备,主站首先通过以太网数据帧头的MAC地址寻址到网段,然后使用Ether ...
- 【leetcode】Implement strStr()
Implement strStr() Implement strStr(). Returns the index of the first occurrence of needle in haysta ...
- nested exception is org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 56; cvc-complex-type.2.4.c通配符的匹配很全面, 但无法找到元素 'dubbo:application' 的声明
严重: Exception sending context initialized event to listener instance of class org.springframework.we ...
- php接口和多态的概念以及简单应用
接口是面向对象中的一个重要特性,也是面向对象开发不可缺少的一个概念,下面简单说一下接口的概念,先看一段简单的代码: interface ICanEat { public function eat($f ...