LA 3415 保守的老师
题目链接:https://vjudge.net/contest/161820#problem/E
题意:
有一些同学,要从中选出一些同学来,人数尽量多,但是,两两之间要满足至少一个条件(身高差>40,性别相同,。。。)
分析:
最大独立集:尽量选择多的结点,任意两个结点不相邻;
男同学X,女同学Y,如果可能产生关系,连一条边,这样这两个人就不会在一起;
最大独立集=n-最大匹配
证明:
最小点覆盖 = 对于每一条边,至少有一个点要被选中
最大独立集 = 对于每一条边,最多一个点被选中
从定义中可以看出,这两个是互补的;
#include <bits/stdc++.h>
using namespace std;
const int maxn = +;
struct BPM {
int n,m;
vector<int> G[maxn];
int left[maxn];
bool T[maxn];
int right[maxn];
bool S[maxn];
void init(int n,int m) {
this->n = n;
this->m = m;
for(int i=;i<n;i++)
G[i].clear();
}
void AddEdge(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 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;
}
int solve() {
memset(left,-,sizeof(left));
memset(right,-,sizeof(right));
int ans = ;
for(int u=;u<n;u++) {
memset(S,,sizeof(S));
memset(T,,sizeof(T));
if(match(u))
ans++;
}
return ans;
}
}sol;
struct Student {
int h;
string music,sport;
Student(int h,string music,string sport):h(h),music(music),sport(sport) {}
};
bool conflict(const Student& a,const Student& b) {
return abs(a.h-b.h)<=&&a.music ==b.music && a.sport!=b.sport;
}
int main()
{
int t;
cin>>t;
while(t--) {
int n;
cin>>n;
vector<Student> male,female;
for(int i=;i<n;i++) {
int h;
string gender,music,sport;
cin>>h>>gender>>music>>sport;
if(gender[]=='M') male.push_back(Student(h,music,sport));
else female.push_back(Student(h,music,sport));
}
int x = male.size();
int y = female.size();
sol.init(x,y);
for(int i=;i<x;i++)
for(int j=;j<y;j++)
if(conflict(male[i],female[j]))
sol.AddEdge(i,j);
printf("%d\n",x+y-sol.solve());
}
return ;
}
LA 3415 保守的老师的更多相关文章
- LA 3415 (二分图+最大独立集)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- 【LA3415 训练指南】保守的老师 【二分图最大独立集,最小割】
题意 Frank是一个思想有些保守的高中老师.有一次,他需要带一些学生出去旅行,但又怕其中一些学生在旅行中萌生爱意.为了降低这种事情发生的概率,他决定确保带出去的任意两个学生至少要满足下面四条中的一条 ...
- LA3415保守的老师
题意: 有n个学生,老师要带他们出去玩,但是老师比较保守,怕他们之间萌生爱意,所以带出去的所有同学必须至少满足四个条件中的一组,问最多能带多少人出去玩. 思路: 比较简单二分 ...
- uva 12083 Guardian of Decency (二分图匹配)
uva 12083 Guardian of Decency Description Frank N. Stein is a very conservative high-school teacher. ...
- poj 2771 Guardian of Decency 解题报告
题目链接:http://poj.org/problem?id=2771 题目意思:有一个保守的老师要带他的学生来一次短途旅行,但是他又害怕有些人会变成情侣关系,于是就想出了一个方法: 1.身高差距 ...
- Guardian of Decency UVALive - 3415 最大独立集=结点数-最大匹配数 老师带大学生旅游
/** 题目:Guardian of Decency UVALive - 3415 最大独立集=结点数-最大匹配数 老师带大学生旅游 链接:https://vjudge.net/problem/UVA ...
- CG基础教程-陈惟老师十二讲笔记
转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...
- cdoj916-方老师的分身 III 【拓扑排序】
http://acm.uestc.edu.cn/#/problem/show/916 方老师的分身 III Time Limit: 3000/1000MS (Java/Others) Memo ...
- leggere la nostra recensione del primo e del secondo
La terra di mezzo in trail running sembra essere distorto leggermente massima di recente, e gli aggi ...
随机推荐
- javascript 定时任务封装
/** * 定时任务 * 间隔时间,执行次数,要带的参数,要执行的函数. */ var TimingTask = function(time,count,param,fun){ this.id = - ...
- 单元测试框架AndroidTestCase
我不是讲怎么成为一个安卓测试员,就不写那么多了 就写我们常用的, AndroidTestCase 为一Android平台下通用的测试类,它支持所有JUnit的Assert方法和标准的setUp 和te ...
- hibernateAPI详解
1 Configuration package www.test.b_api; import org.hibernate.Session; import org.hibernate.SessionFa ...
- linux_api之信号
本片索引: 1.引言 2.信号 3.程序启动 4.signal函数 5.系统调用的中断和系统调用的重启(了解) 6.可再入与不可再入函数(了解) 7.kill函数和raise函数 8.alarm函数和 ...
- BNU27935——我爱背单词——————【数组模拟】
我爱背单词 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name: ...
- BNU29376——沙漠之旅——————【技巧题】
沙漠之旅 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name: M ...
- react native 完美解决启动白屏
先讲下我的RN版本0.58.5 首先安装react-native-splash-screen(目前使用的版本是3.2.0) 项目地址https://github.com/crazycodeboy/re ...
- [转]MVC+JQuery validate实现用户输入验证
本文转自:http://www.cnblogs.com/ahui/archive/2010/10/08/1845677.html MVC服务器端: 1.在controller中验证用户输入,如果验证失 ...
- C#IO流文件操作
文件流 创建文件流 读写文件的第一步就是创建文件流,流是一个用于数据传输的个对象,它是FileStream类型,在创建一个文件流是需要在他的构造中指定参数 语法: FileStream 文件流对象=n ...
- 对while;do while;for三种循环语句的理解与区分。
while:先判断表达式的值,在表达式值为真的情况下执行循环语句,直到表达式值为假结束循环: while(循环条件) { 循环体. } do-while:先执行循环体语句一次,再判别表达式的值,在表达 ...