题意

有n个同学,给出同学之间的爱慕关系,选出一个集合使得集合中的人没有爱慕关系。问能选出的最大集合是多少。

分析

二分图的最大独立集。

最大独立集的意思是,在图中选出最多的点,使他们两两之间没有边,这个顶点的集合就是最大独立集。

先下结论:如果一个图是二分图,|最大独立集| = |V|-|最大匹配数|。

我们这么思考(设匹配数为\(v\)):

如果把二分图的最大匹配从原图中去掉,剩下的\(n-2v\)个顶点肯定是没有边相连的(如果还有边相连,我们可以一定可以再加入到匹配中,那还是个锤子的最大匹配)。此时剩下的顶点已经是一个独立集了。接下来,从每条匹配边的两端取一个结点加入独立集中,一定可以使得独立集仍然是独立集:因为对于最大匹配中的任意两个点,要么\(x\)到\(y\)有一条边,要么\(y\)到\(x\)有一条边,要么\(x\)到\(y\)没有边且\(x\)到\(y\)也没有边。这样就能得到这个题目的答案了。

注意:Hungry是针对有向图的,对于无向图match数成了原来的2倍,要除以2。这题除以2的原因和这个还不一样:由于题目没有给出哪些是男的哪些是女的(没有明显的二分图),所以我们是对二分图的两边去进行匹配的(还记得kuangbin的板子吗?在hungary算法中,我们只对一侧进行dfs操作)。所以最大匹配数应该是求出来的数除以2 。

代码

这题的输入格式比较特别,scanf社保之。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define MS(x,y) memset(x,y,sizeof(x))
using namespace std; bool mat[1005][1005];
bool vis[1005];
int link[1005],n; int dfs(int u)
{
rep(i,0,n-1)
{
if(mat[u][i] && !vis[i])
{
vis[i]=true;
if(link[i]==-1 || dfs(link[i]))
{
link[i]=u; return true;
}
}
}
return false;
} int hungary()
{
MS(link,-1);
int res=0;
rep(i,0,n-1)
{
MS(vis,false);
if(dfs(i)) res++;
}
return res/2;
} int main()
{
while(scanf("%d",&n)==1)
{
ZERO(mat);
rep(i,1,n)
{
int x, k;
scanf("%d: (%d)", &x, &k);
rep(j,1,k)
{
int tmp;
scanf("%d", &tmp);
mat[x][tmp]=true;
}
}
printf("%d\n", n-hungary());
}
return 0;
}

最新文章

  1. Spring框架之AOP
  2. js原生捕鱼达人(一)
  3. MATLAB符号运算
  4. RDO部署openstack(2)
  5. [转载]解决zabbix在configure时候遇到的问题(Ubuntu)
  6. Log4J2基本配置
  7. HTML/CSS/Javascript调试入门(转)
  8. swift学习 - tableView自适应高度2(SnapKit Layout)
  9. Android自定义processor实现bindView功能
  10. 提高UI设计效率的4个技巧
  11. JS及相关控件
  12. 模仿input闪烁光标
  13. chrome浏览器调试工具你会使用吗?
  14. Visual Studio references中的package找不到
  15. GIT命令基本使用
  16. 【转】给Java说句公道话
  17. 从0开始:Windows内核利用的另一种方式
  18. WPF 中对启动参数的处理
  19. C#调用C++库知识点
  20. css3效果隔两秒旋转然后停两秒再继续旋转,无限循环

热门文章

  1. 使用Timer组件_实现定时更改窗体颜色
  2. jquery分页例子
  3. Jenkins+maven(testng)项目(本地项目配置)
  4. es6之数组方法
  5. vue+elementUI封装的时间插件(有起始时间不能大于结束时间的验证)
  6. Linux关于scp命令
  7. 阿里云linux服务器登录失败,Connection closed
  8. HDU 1286 找新朋友 (欧拉公式或者标记法(其实就是欧拉公式的思想))
  9. CF1066CBooks Queries(数组的特殊处理)
  10. STL笔记