UVALive 3415 Guardian of Decency(二分图的最大独立集)
题意:老师在选择一些学生做活动时,为避免学生发生暧昧关系,就提出了四个要求。在他眼中,只要任意两个人符合这四个要求之一,就不可能发生暧昧。现在给出n个学生关于这四个要求的信息,求老师可以挑选出的最大学生数量。
分析:
1、这里的问题可以抽象成求最大独立集:若两人发生暧昧,则在两人中建边,当四个条件中任意一个成立,则将两个人孤立。老师选择的学生必然是两两之间不会发生暧昧的。
公式:最大独立集=顶点总数V-最小点覆盖
2、这里涉及到离散数学中一些集合的概念,理解起来对在下实属不易,所以就先记住吧。(定义也只是挑重要的记录下来)
独立集:该集合中的点,两两之间不相邻(没有边)(单独一个点就是独立集)。一个图中含顶点数目最多的独立集称为最大独立集。
支配集:满足图上任意一个点要么就在集合内,要么也是与集合中的点相邻(顶点集V即是支配集)。一个图中含顶点数最少的支配集称为最小支配集。
最小点覆盖:当一个点被选入集合,认为与之相连的边都被覆盖了。在能够覆盖所有边的前提下,顶点数最少的集合称为最小点覆盖。
团:与独立集相反,集合中的点两两之间都相邻。一个图中含顶点数最多的团称为最大团。
性质:
最大独立集+最小覆盖集=V
最大团=补图的最大独立集
最小覆盖集=最大匹配
3、这里提到了一个最大独立集的样例:http://my.opera.com/IloveLunamaria/blog/show.dml/810972
其中最赞的一个观点:一般的用二分图匹配解决的问题,都是要证明题目条件等价于“匹配”,就是题目条件等价于“选择一些边,使得每个点都只在一条边中。
必须明确概念,才去做题目。最大独立集本身与最大匹配无关,是因为其在数学上与最小点覆盖集合互补,又有可以用最大匹配解决最小点覆盖,所以才得出:可以用最大匹配解最大独立集。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#define clr(a,m) memset(a,m,sizeof(a))
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int MAXN=; struct Person{
int h;
char sex[],music[],sport[];
}p[MAXN]; int n,ans,man,woman; vector<int>G[MAXN];
vector<int>row,col; int left[MAXN],right[MAXN],S[MAXN],T[MAXN]; void init()
{
rep(i,,n)
G[i].clear();
} bool check(int i,int j)
{
if(fabs(p[i].h-p[j].h)>)return false;
if(strcmp(p[i].sex,p[j].sex)==)return false;
if(strcmp(p[i].music,p[j].music)!=)return false;
if(strcmp(p[i].sport,p[j].sport)==)return false;
return true;
} void read()
{
init();
rep(i,,n)
scanf("%d%s%s%s",&p[i].h,p[i].sex,p[i].music,p[i].sport);
man=;
rep(i,,n)
if(p[i].sex[]=='M'){
woman=;
rep(j,,n){
if(p[j].sex[]=='F'){
if(check(i,j))
G[man].push_back(woman);
woman++;
}
}
man++;
}
} bool match(int u)
{
S[u]=true;
int sz=G[u].size();
rep(i,,sz-){
int v=G[u][i];
if(!T[v]){
T[v]=true;
if(!left[v]||match(left[v])){
left[v]=u;
right[u]=v;
return true;
}
}
}
return false;
} void AP()
{
rep(i,,woman)left[i]=;
rep(i,,man)right[i]=; ans=;
rep(i,,man){
rep(j,,man)S[j]=;
rep(j,,woman)T[j]=;
if(match(i))
ans++;
}
} void print()
{
printf("%d\n",n-ans);
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
read();
AP();
print();
}
return ;
}
UVALive 3415 Guardian of Decency(二分图的最大独立集)的更多相关文章
- uvalive 3415 Guardian Of Decency
题意: 有一个老师想组织学生出去旅游,为了避免他们之间有情侣产生,他制定了一系列的条件,满足这些条件之一,那么这些人理论上就不会成为情侣: 身高相差40cm:性别相同:喜欢的音乐风格不同:最喜欢的运动 ...
- UVA-12083 Guardian of Decency 二分图 最大独立集
题目链接:https://cn.vjudge.net/problem/UVA-12083 题意 学校组织去郊游,选择最多人数,使得任意两个人之间不能谈恋爱 不恋爱条件是高差大于40.同性.喜欢的音乐风 ...
- Guardian of Decency UVALive - 3415 最大独立集=结点数-最大匹配数 老师带大学生旅游
/** 题目:Guardian of Decency UVALive - 3415 最大独立集=结点数-最大匹配数 老师带大学生旅游 链接:https://vjudge.net/problem/UVA ...
- Guardian of Decency(二分图)
Guardian of Decency Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submi ...
- POJ2771_Guardian of Decency(二分图/最大独立集=N-最大匹配)
解决报告 http://blog.csdn.net/juncoder/article/details/38159017 题目传送门 题意: 看到题目我就笑了.., 老师觉得这种两个学生不是一对: 身高 ...
- POJ 2771 Guardian of Decency 【最大独立集】
传送门:http://poj.org/problem?id=2771 Guardian of Decency Time Limit: 3000MS Memory Limit: 65536K Tot ...
- POJ 2771 Guardian of Decency (二分图最大点独立集)
Guardian of Decency Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6133 Accepted: 25 ...
- uva 12083 Guardian of Decency (二分图匹配)
uva 12083 Guardian of Decency Description Frank N. Stein is a very conservative high-school teacher. ...
- UVAlive3415 Guardian of Decency(最大独立集)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34831 [思路] 二分图的最大独立集. 即在二分图中选取最多的点, ...
随机推荐
- asp.net 认证与授权
1.下面的例子在web.config文件中配置网站使用asp.net forms 身份认证方式: <configuration> <system.web> <authen ...
- ZOJ3231 Apple Transportation(最小费用流)
题目给你一棵苹果树,然后每个结点上有一定的苹果树,你要将苹果运输达到某个状态,使得均方差最小. 将苹果x个从a->b的花费是x*w,w是边权. 当时比赛的时候想的就是,最后达到的状态一定是sum ...
- SGU 102
For given integer N (1<=N<=104) find amount of positive numbers not greater than N that coprim ...
- Spinner学习
我暂且把Spinner称作下拉选择框吧,先来看一下它的效果: 在layout文件中添加Spinner的代码如下: <Spinner android:id="@+id/planets_s ...
- SVN用法(merge,branch,switch)
SVN merge命令用法 使用svn的merge命令,把一个版本的变化合并到另一个版本.我使用的tortoise,在当前的工作目录点击右键,选择merge,在from框输入源url,在revisio ...
- hdu 2873 Bomb Game 博弈论
SG函数打表,求NIM和!!! 代码如下: #include<cstdio> #include<cstring> #include<iostream> #inclu ...
- MySql经典语句
1.三个函数: LENGTH SUBSTR LOCATE )) order by WebSiteShopUrl desc 2.序号 两种方法 第一种方法: ) ) as it 第二种方法: ; ...
- NIM博弈的必胜取法
#include<stdio.h> ; int a[Max]; int main() { int i,n,ans; int tmp; while(scanf("%d", ...
- Android 实现全屏、无标题栏
实现全屏无标题栏: 1.在xml文件中进行配置 AndroidManifest.xml中,找到需要全屏或设置成无标题栏的Activity,在该Activity进行如下配置即可. 实现全屏效果: and ...
- C++时间戳转化(涉及GMT CST时区转化)
问题由来 时间戳转换(时间戳:自 1970 年1月1日(00:00:00 )至当前时间的总秒数.) #include <stdio.h> #include <time.h> i ...