题意:老师在选择一些学生做活动时,为避免学生发生暧昧关系,就提出了四个要求。在他眼中,只要任意两个人符合这四个要求之一,就不可能发生暧昧。现在给出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(二分图的最大独立集)的更多相关文章

  1. uvalive 3415 Guardian Of Decency

    题意: 有一个老师想组织学生出去旅游,为了避免他们之间有情侣产生,他制定了一系列的条件,满足这些条件之一,那么这些人理论上就不会成为情侣: 身高相差40cm:性别相同:喜欢的音乐风格不同:最喜欢的运动 ...

  2. UVA-12083 Guardian of Decency 二分图 最大独立集

    题目链接:https://cn.vjudge.net/problem/UVA-12083 题意 学校组织去郊游,选择最多人数,使得任意两个人之间不能谈恋爱 不恋爱条件是高差大于40.同性.喜欢的音乐风 ...

  3. Guardian of Decency UVALive - 3415 最大独立集=结点数-最大匹配数 老师带大学生旅游

    /** 题目:Guardian of Decency UVALive - 3415 最大独立集=结点数-最大匹配数 老师带大学生旅游 链接:https://vjudge.net/problem/UVA ...

  4. Guardian of Decency(二分图)

    Guardian of Decency Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submi ...

  5. POJ2771_Guardian of Decency(二分图/最大独立集=N-最大匹配)

    解决报告 http://blog.csdn.net/juncoder/article/details/38159017 题目传送门 题意: 看到题目我就笑了.., 老师觉得这种两个学生不是一对: 身高 ...

  6. POJ 2771 Guardian of Decency 【最大独立集】

    传送门:http://poj.org/problem?id=2771 Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Tot ...

  7. POJ 2771 Guardian of Decency (二分图最大点独立集)

    Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6133   Accepted: 25 ...

  8. uva 12083 Guardian of Decency (二分图匹配)

    uva 12083 Guardian of Decency Description Frank N. Stein is a very conservative high-school teacher. ...

  9. UVAlive3415 Guardian of Decency(最大独立集)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34831 [思路] 二分图的最大独立集. 即在二分图中选取最多的点, ...

随机推荐

  1. 设计模式之Builder模式

    一.感性认识 二.Builder模式 1.定义 一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.即构建过程相同,但是子部件却不相同. 2.结构说明 Builder: 创建者接口 ...

  2. Codeforces Round #260 (Div. 2) A~C

    题目链接 A. Laptops time limit per test:1 secondmemory limit per test:256 megabytesinput:standard inputo ...

  3. BZOJ 1046: [HAOI2007]上升序列 LIS -dp

    1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3438  Solved: 1171[Submit][Stat ...

  4. socket传输过程

    连接过程: 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. (1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处 ...

  5. Chrome 开发工具指南

    Chrome 开发工具指南 谷歌 Chrome 开发工具,是基于谷歌浏览器内含的一套网页制作和调试工具.开发者工具允许网页开发者深入浏览器和网页应用程序的内部.该工具可以有效地追踪布局问题,设置 Ja ...

  6. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  7. lintcode:玩具工厂

    题目 工厂模式是一种常见的设计模式.请实现一个玩具工厂 ToyFactory 用来产生不同的玩具类.可以假设只有猫和狗两种玩具.   样例 ToyFactory tf = ToyFactory(); ...

  8. Hadoop处理大量小文件的问题和解决方法

    小文件指的是那些size比HDFS的block size(默认64M)小的多的文件.如果在HDFS中存储小文件,那么在HDFS中肯定会含有许许多多这样的小文件(不然就不会用hadoop了).而HDFS ...

  9. AppWidget框架

    AppWidget 框架主要包括以下类: 1.AppWidgetProvider:继承自BroadcastReceiver,在AppWidget应用update.enable.disable和dele ...

  10. ios开发--编码格式

    1.url编码 ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是: NSString * encodingString = [urlString stringByAddingPe ...