POJ - 1466 Girls and Boys 二分图+最大独立集
2015-10-15 11:17
609 查看
标题效果:有着n学生,有一些同学之间的特殊关系。。
。为了一探究竟m学生。要求m免两者之间的学生有没有这样的特殊关系
解决问题的思路:二分图的问题,殊关系是对称的。所以能够将两个点集都设置为n个点。求出最大匹配后再除以2就可以得到(由于关系是对称的。所以所求得的最大匹配是双倍的)
得到最大匹配了,能够由定理得到 最大独立集 = n - 最大匹配数
。为了一探究竟m学生。要求m免两者之间的学生有没有这样的特殊关系
解决问题的思路:二分图的问题,殊关系是对称的。所以能够将两个点集都设置为n个点。求出最大匹配后再除以2就可以得到(由于关系是对称的。所以所求得的最大匹配是双倍的)
得到最大匹配了,能够由定理得到 最大独立集 = n - 最大匹配数
#include<cstdio> #include<vector> #include<cstring> using namespace std; const int N = 510; vector<int> s ; int vis ; int link ; int n; bool dfs(int u) { for(int i = 0; i < s[u].size(); i++) { if(!vis[s[u][i]]) { vis[s[u][i]] = 1; if(link[s[u][i]] == -1 || dfs(link[s[u][i]])) { link[s[u][i]] = u; return true; } } } return false; } int main() { while(scanf("%d", &n) != EOF) { for(int i = 0; i < n; i++) s[i].clear(); int x, y, z; for(int i = 0; i < n; i++) { scanf("%d: (%d)", &x, &y); for(int j = 0; j < y; j++) { scanf("%d", &z); s[x].push_back(z); } } int ans = 0; memset(link, -1, sizeof(link)); for(int i = 0; i < n; i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } printf("%d\n", n - ans / 2); } return 0; }
相关文章推荐
- mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
- @manytoone设置为optional=true不起作用
- 从游戏脚本语言说起,剖析Mono搭建的脚本基础
- 【IOS 开发学习总结-OC-49】★★ios开发之UI控件——UIStepper与UIWebView
- 解决vc最大化窗口时,任务栏被覆盖的问题
- 字符串搜索匹配算法学习收集(tire树/自动机/kmp/Boyer-moore)
- centos7系统的emergency mode的原因之一及解决方法
- 学习Javascript闭包(Closure)
- 设计模式之构造者模式
- FTP链接ubuntu链接被拒绝
- list
- MySQL深入浅出
- iOS容易造成循环引用的三种场景
- poj 1503 大数相加(java)
- 9月开发总结
- PHP 换行处理
- JSP九大内置对象
- 装了CentOS 64-bit 输入ifconfig 为什么inet0没有inet addr
- 给VMware下的Linux扩展磁盘空间(以CentOS6.5为例)
- 描述位置和大小的属性