uva12083 二分图 求最大独立集 转化为求最大匹配 由题意推出二分图
这题大白书例题 :
Frank 是一个思想有些保守的高中老师,有一次,他需要带一些学生出去旅行,但又怕其中一些学生在旅途中萌生爱意。为了降低这种事情的发生概率,他决定确保带出去的任意两个学生至少要满足下面4条中的一条
1 身高相差大于40
2 性别相同
3 最喜欢的音乐属于不同的类型
4 最喜欢的体育比赛相同
任务帮组Frank挑选尽量多的学生,使得任意两个学生至少满足上述条件中的一条。
解 将不能同时去的人连一条边 就变成求最大独立集,即选择尽量多的节点,使得任意两个节点不相邻。|最大独立集|+|最小顶点覆盖| =|V | 在二分图中 最大匹配为最小顶点覆盖
由于出行中存在男与女 此时可以保证是一个二分图
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn =;
struct person{
int num;
int high;
char male[];
char love_muc[];
char love_ty[];
}P[maxn]; struct BPM {
int n, m; // 左右顶点个数
vector<int> G[maxn]; // 邻接表
int left[maxn]; // left[i]为右边第i个点的匹配点编号,-1表示不存在
bool T[maxn]; // T[i]为右边第i个点是否已标记
int right[maxn]; // 求最小覆盖用
bool S[maxn]; // 求最小覆盖用
void inti(int n,int m){
this->n =n; this->m=m;
for(int i=; i<n; i++) G[i].clear();
}
void add_edg(int u, int v){
G[u].push_back(v);
}
bool match(int u){
S[u]=true;
for(int i=; i<G[u].size(); i++){
int to = G[u][i];
if(!T[to]){
T[to]=true;
if(left[to]==-||match(left[to])){
left[to]=u; right[u]=to;
return true;
}
}
}
return false;
}
int solve(){
memset(left,-,sizeof(left));
memset(right,-,sizeof(right));
int ans=;
for(int i=; i<n; i++){
memset(S,false,sizeof(S));
memset(T,false,sizeof(T));
if(match(i)) ans++;
}
return ans;
}
}solver; int main()
{
int cas;
scanf("%d",&cas);
for(int cc =; cc<=cas; ++cc){
int n;
scanf("%d",&n);
int Mnum=,Fnum=;
for(int i=; i<n; i++){
scanf("%d%s%s%s",&P[i].high,P[i].male,P[i].love_muc,P[i].love_ty);
if(P[i].male[]=='M') P[i].num=Mnum++;
else P[i].num=Fnum++;
}
solver.inti(Mnum,Fnum);
for(int i =; i<n; i++)if(P[i].male[]=='M'){ for(int j=; j<n; j++)
if(
P[j].male[]=='F'&&abs(P[i].high-P[j].high)<=
&&strcmp(P[i].love_muc,P[j].love_muc)==&&
strcmp(P[i].love_ty,P[j].love_ty)!=
) solver.add_edg(P[i].num,P[j].num); }
int ans = solver.solve();
printf("%d\n",n-ans);
}
return ;
}
uva12083 二分图 求最大独立集 转化为求最大匹配 由题意推出二分图的更多相关文章
- hdu 1068 Girls and Boys(匈牙利算法求最大独立集)
Girls and Boys Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- (hdu step 6.3.7)Cat vs. Dog(当施工方规则:建边当观众和其他观众最喜爱的东西冲突,求最大独立集)
称号: Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- poj1419 求最大独立集
题目链接:http://poj.org/problem?id=1419 题意:求最大独立集 思路: 这里有一个定理: 最大独立集=补图的最大团最大团=补图的最大独立集 所以这里我们只要求给出的图的最大 ...
- BZOJ1001: [BeiJing2006]狼抓兔子(优化的dinic或转化对偶图求最短路)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 30078 Solved: 7908[Submit][ ...
- UVALive 3415 Guardian of Decency(二分图的最大独立集)
题意:老师在选择一些学生做活动时,为避免学生发生暧昧关系,就提出了四个要求.在他眼中,只要任意两个人符合这四个要求之一,就不可能发生暧昧.现在给出n个学生关于这四个要求的信息,求老师可以挑选出的最大学 ...
- (step6.3.2)hdu 1068(Girls and Boys——二分图的最大独立集)
题目大意:第一行输入一个整数n,表示有n个节点.在接下来的n行中,每行的输入数据的格式是: 1: (2) 4 6 :表示编号为1的人认识2个人,他们分别是4.6: 求,最多能找到多少个人,他们互不认识 ...
- 「CODVES 1922 」骑士共存问题(二分图的最大独立集|网络流)&dinic
首先是题目链接 http://codevs.cn/problem/1922/ 结果发现题目没图(心情复杂 然后去网上扒了一张图 大概就是这样了. 如果把每个点和它可以攻击的点连一条边,那问题就变成了 ...
- HAOI2017 新型城市化 二分图的最大独立集+最大流+强连通缩点
题目链接(洛谷):https://www.luogu.org/problemnew/show/P3731 题意概述:给出一张二分图,询问删掉哪些边之后可以使这张二分图的最大独立集变大.N<=10 ...
- hdoj1068 Girls and Boys(二分图的最大独立集)
题意:有n个人,要彼此认识.选择一个集合,使得集合里的每个人相互不认识.求集合中人数的最大值. 求二分图的最大独立集. 公式:最大独立集=顶点数-最大匹配 这个题目中因为集合是一个,所以求出最大匹配数 ...
随机推荐
- 调用TerminateProcess是无法触发DLL_PROCESS_DETACH的
当应用程序中调用TerminateProcess函数,对于在DllMain函数中处理DLL_PROCESS_DETACH的额外代码操作是无法被执行的.比如:释放资源.数据持久化等.
- IOS 7 更改导航栏文字到白色
To hide status bar in any viewcontroller: -(BOOL) prefersStatusBarHidden { return YES; } To change t ...
- 【咸鱼教程】TextureMerger1.6.6 二:Sprite Sheet的制作和使用
Sprite Sheet主要用于将零碎的小图合并成一张整图.减少加载图片时http的请求次数. 1 打开TextureMerger,选择Sprite Sheet 2 添加纹理(未创建项目时,会先弹出 ...
- 网站测速、ping
1.17ce 2. 360奇云测 3.http://ping.chinaz.com/ 效果图:
- kvm虚拟机中virbr0虚拟网络接口的删除与恢复
安装 KVM 后都会发现网络接口里多了一个叫做 virbr0 的虚拟网络接口 一般情况下,虚拟网络接口virbr0用作nat,以允许虚拟机访问网络服务,但nat一般不用于生产环境.我们可以使用以下方法 ...
- [Html5] HTML5 开发手机应用
上次周例会我给大家做了题目为:<漫游移动平台前端开发>的汇报,现在推荐一些额外的学习资料. 依照目前iPhone/Android 迅速提升市占率的情势来看,未来如果想要在 ...
- 解决IE6下透明图片有背景的问题
描述,透底的图片,在其他浏览器中效果: 在IE6中的效果: 1.改图片 IMG 换用gif格式的图片,但是这样的话图片效果不好: 想让IE6用gif的图片,其他浏览器用png图片,但是只有IE有这样 ...
- python的十进制与任意进制的转换
将任意进制转换成十进制 ", 8)) # 表示把8进制的54转换成十进制数并输出结果. # 8可以是2.8,10,16等进制数 将十进制转换成任意进制 def f(n,x): #n为待转换的 ...
- 关于webpy模板自动HTML转义的问题
注意: web.py 将会转义任何任何用到的变量,所以当你将 name 的值设为是一段 HTML 时,它会被转义显示成纯文本.如果要关闭该选项,可以写成 $:name 来代替 $name. 如果我们想 ...
- 安装和卸载windows服务程序
安装window服务 安装命令:InstallUtil.exe MyServiceLog.exe InstallUtil存在路径为:C:\WINDOWS\Microsoft.NET\Framework ...