HDU 1068 Girls and Boys (二分图最大独立集)
2016-07-14 18:06
417 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068
有n个同学,格式ni:(m) n1 n2 n3表示同学ni有缘与n1,n2,n3成为情侣,求集合中不存在有缘成为情侣的同学的最大同学数。
独立集(图的顶点集的子集,其中任意两点不相邻)
二分图中 最大独立集 = 顶点个数 - 最大匹配数
因为男女不知道,将一个人拆成两个性别,求最大匹配后,除以2就行了。
这种做法比较难理解。
有n个同学,格式ni:(m) n1 n2 n3表示同学ni有缘与n1,n2,n3成为情侣,求集合中不存在有缘成为情侣的同学的最大同学数。
独立集(图的顶点集的子集,其中任意两点不相邻)
二分图中 最大独立集 = 顶点个数 - 最大匹配数
因为男女不知道,将一个人拆成两个性别,求最大匹配后,除以2就行了。
这种做法比较难理解。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N = 1e3 + 5; struct Edge { int next , to; }edge[N * N]; int head , cnt; int match ; bool vis ; void init() { memset(head , -1 , sizeof(head)); memset(match , -1 , sizeof(match)); memset(vis , false , sizeof(vis)); cnt = 0; } inline void add(int u , int v) { edge[cnt].next = head[u]; edge[cnt].to = v; head[u] = cnt++; } bool dfs(int u) { for(int i = head[u] ; ~i ; i = edge[i].next) { int v = edge[i].to; if(!vis[v]) { vis[v] = true; if(match[v] == -1 || dfs(match[v])) { match[v] = u; return true; } } } return false; } int hungry(int n) { int res = 0; for(int i = 0 ; i < n ; ++i) { memset(vis , false , sizeof(vis)); if(dfs(i)) res++; } return res; } int main() { int n; while(~scanf("%d" , &n)) { init(); int v; for(int i = 0 ; i < n ; ++i) { int num1 , num; scanf("%d: (%d) ", &num1 , &num); while(num--) { scanf("%d" , &v); add(i , v); } } printf("%d\n" , n - hungry(n)/2); } return 0; }
相关文章推荐
- js定时相关函数:
- 项目启动后一会儿就停止
- Python机器登陆新浪微博代码示例
- Bash的变量和参数
- Android 6.0运行时权限理解
- 资源库汇总
- **PHP** 语法(2)-字符串函数&常量
- 三目运算表达式 流程控制优美之处
- Android中使用Pull解析器解析xml文件+进行简单的单元测试
- XML之------DOM对XML文档增删改查
- 一个网站同一域名不同目录下的文件访问到的cookie值不同是什么原因?
- window.open在IE下ajax中的兼容性
- 导入旧的Studio项目到新Android Studio 报错的问题
- You've implemented -[ application:didReceiveRemoteNotification:fetchCompletionHandler:],
- 交叉排序
- 欢迎使用CSDN-markdown编辑器
- Maven编译后没有生成class文件的解决办法
- 在android中如何判断当前的apk是否处于运行状态
- maven使用之烦人的.lastUpdated文件
- 排序算法php