HDU 1068 Girls and Boys(最大独立集合 = 顶点数 - 最大匹配数)
2016-03-08 10:37
507 查看
HDU 1068 :题目链接
题意:一些男孩和女孩,给出一些人物关系,然后问能找到最多有多少个人都互不认识。
转换一下:就是大家都不认识的人,即最大独立集合
题意:一些男孩和女孩,给出一些人物关系,然后问能找到最多有多少个人都互不认识。
转换一下:就是大家都不认识的人,即最大独立集合
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <math.h> #define init(a) memset(a,0,sizeof(a)) #define PI acos(-1,0) using namespace std; const int maxn = 510; const int maxm = 100001; #define lson left, m, id<<1 #define rson m+1, right, id<<1|1 #define min(a,b) (a>b)?b:a #define max(a,b) (a>b)?a:b const int N = 50010; int ma[maxn][maxn]; int line[maxn]; bool vis[maxn]; int k,n,m; int DFS(int u) { // printf("u = %d\n",u); for(int v = 0;v<k;v++) { if(ma[u][v]== 1 && vis[v]==0) { vis[v] = 1; if(line[v]== -1 || DFS(line[v])) { line[v] = u; return 1; } } } return 0; } int K_M() { int ans = 0; memset(line,-1,sizeof(line)); for(int i = 0;i<k;i++) { init(vis); ans += DFS(i); } return ans; } int main() { int x,y; while(~scanf("%d",&k)) { init(ma); for(int j = 1;j<=k;j++) { scanf("%d: (%d)",&m,&n); for(int i = 1;i<=n;i++) { scanf("%d",&x); ma[m][x] = 1; } } //最大独立集合 = 顶点数 - 最大匹配数 int ans = K_M(); ans /= 2; printf("%d\n",k-ans); } return 0; }
相关文章推荐
- 源程序版本管理软件和项目管理软件
- layout_gravity和gravity的区别
- 用AWK输出一个tab键
- mongodb 速成笔记
- Codeforces Round #345 (Div. 2) A. Joysticks dp
- android端StarIO热敏打印机打印小票
- 《从零开始学Swift》学习笔记(Day 63)——Cocoa Touch设计模式及应用之单例模式
- MVC
- 产品新人一年的产品经历,产品经理的世界是这样的!
- Linode主机搭建(一)—— 注册账号和申请机器
- 1.设置用户A对目录C有rw权限,用户B对目录C有只读权限。
- md5校验
- 自适应响应式网页设计
- JS和Native交互之 - 运用JavaScriptCore框架进行交互
- LINUX 中的 dump 和 restore 命令
- 127.Examine the data in the CUSTOMERS table:
- (29)odoo的可用小图标
- rsync的断点续传设置。
- 74HC123D 引脚介绍及应用
- HTTP Status Code [RFC]