题意:n个学生,给你每个学生浪漫的学生学号(男女之间浪漫),问你找出一个最大的集合保证集合内的任意两个学生之间没有相互浪漫关系,输出最大集合的人数。

注意:这里的浪漫边是双向的,如果1对2浪漫, 那么2对1也浪漫,题意好像没说清楚, 但我测了一下,是双向边。

思路:最大独立集和最小点覆盖集是互补的,所以 最大独立集 == 总人数n - 最小点覆盖集,

如果题目给你的是二分图那么直接二分匹配一下即可,但这题不是二分图,我们抓住双向边,那么我们进行拆点,

做一次匹配,求出来的匹配数是(左边男生匹配右边女生 + 左边女生匹配右边男生,这两个值是相等的),所以原图的最大匹配为    “求出来的匹配数/2”。那么代入公式就可以算出答案了。

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
const int maxn = 1005;
vector <int> edge[maxn];
int id;
int pre[maxn];
bool vis[maxn];
bool dfs(int u) {
for(int i = 0; i <(int) edge[u].size(); i++) {
int v = edge[u][i];
if(vis[v]) continue;
vis[v] = 1;
if(pre[v] == -1 || dfs(pre[v])) {
pre[v] = u;
return 1;
}
}
return 0;
}
int n;
int main() {
int i;
while( ~scanf("%d", &n)) {
for(i = 0; i < n; i++)
edge[i].clear();
int x, y, tp;
for(i = 0; i < n; i++) {
scanf("%d: (%d)", &x, &tp);
while(tp--) {
scanf("%d", &y);
edge[x].push_back(y);
}
}
memset(pre, -1, sizeof(int)*n);
int cnt = 0;
for(i = 0; i < n; i++) {
memset(vis, 0, sizeof(bool)*n);
if(dfs(i)) cnt++;
}
printf("%d\n", n-(cnt>>1)); }
return 0;
}

最新文章

  1. 免费SVN服务器笔记
  2. java 深度探险 java 泛型
  3. phalcon:数据库分库,读写分离,负载均衡 系统方法执行顺序
  4. JS鼠标滑轮事件的写法和按键的事件
  5. C语言1-100连加,求质数,算瑞年检测字母大小写,登录系统
  6. Linux文件系统的设计
  7. 最大流量dinci模板
  8. javascript 中 function bind()
  9. Android基础知识大全(精品)
  10. WampSever 安装问题解析
  11. 用JavaScript写一个区块链
  12. python从入门到实践-11章测试模块(测试函数出问题)
  13. Vue项目使用bootstrap
  14. Linux之整理bash命令类型
  15. 常用类及 LeetCode 每日一题
  16. UNITY2018 真机开启deepprofiling的操作
  17. 【EJB学习笔记】——EJB开发环境搭建(Eclipse集成JBoss)
  18. linux学习路线图
  19. Centos7安装killall,fuser, killall,pstree和pstree.x11
  20. hdu1257 最少拦截系统(贪心) 2016-05-19 20:28 90人阅读 评论(0) 收藏

热门文章

  1. pChart图表插件使用
  2. 将 jsp 页面的值 传到struts2 action中(不是表单中的值)
  3. E. Riding in a Lift(Codeforces Round #274)
  4. Shell之sed命令
  5. saltstack:使用教程之二高级模块用法Grains、Pillar
  6. 基于visual Studio2013解决C语言竞赛题之0613递归求积
  7. Ubuntu一些配置和技巧
  8. 【linux kernel】 softirq 软中断讨论
  9. PC-lint 简明教程
  10. QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)