男生和女生(思维建图,最大独立集问题)

问题描述
在大学二年级,一些人开始了同学之间罗曼蒂克关系的研究。有“罗曼蒂克”关系是针对男生和女生之间的关系而言的。研究的原因是找到满足以下条件的最大集:这个集中没有两个学生有“罗曼蒂克”关系。现要你编程确定这样一个集中学生的人数。

输入
有若干组测试数据,每组测试数据表示一组研究对象,描述如下:
学生人数
对每个学生的描述,遵循如下格式:
学号:(罗曼蒂克关系的数目) 学号1 学号2…
或者是
学号:(0)
对n个对象的数据,学号是从0到n-1之间的整数,(n≤500)。

输出
对每组测试数据,输出一行,即没有“罗曼蒂克”关系的最大集中学生的人数。

将有“罗曼蒂克”的男生与女生之间连一条边。得到男生与女生关系二分图。
以样例一为例:

最大独立集的元素个数问题
在一个图G中的点集D,如果D中任意两点不相连,那么D称为G的一个独立集。而G中点数最多的独立集就是最大独立集。
二分图的最大独立集问题:
最大独立集点数 = 二分图G的顶点总数 – G的最大匹配数

本问题可转化为求G的最大独立集的元素个数问题。
问题再次转化为二分图的最大匹配问题,可采用的匈牙利算法。

本题中并没有告诉哪些是男生,哪些是女生。如何分离?
方法:依据有“罗曼蒂克”关系的两人必是一男一女来确定他们属于哪一个集合。即如确定一人是某种性别的,如男性,那么与之有关系是女性。
为方便处理,用取值0、1的数组is分别记载这两种性别的学生,分别称为0-集和1-集。
现在,开始时设所有学生都属于0-集,逐个考察每个学生的归类。从0-集中取未做考察标记的学生,从该学生开始考察。设当前考察的学生是i,那么凡是与i有关系的学生被归入(1-is[i])-集,同时对i做好考察标记。

分离算法实现过程:

     for(int i = 0; i < n; ++i){for(int j = 0; j < n; ++j){if(g[i][j]){is[j] = 1 - is[i];}}}

细节注意:
在已成功分离出0-组与1-组这两个组的数组is中,仍可能能还存在无法分清男女生的学生情况。
这些学生都被编入0-组;
他或她与其他学生之间都没有关系。
但这些学生的存在对本问题求最大独立集与最大匹配是没有影响的。

AC code:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 500 + 50;
int link[maxn];
vector<vector<int> >G(maxn);
bool vis[maxn];
bool dfs(int u){for(int i = 0; i < G[u].size(); ++i){int v = G[u][i];if(!vis[v]){vis[v] = 1;if(link[v] == -1 || dfs(link[v])){link[v] = u;return true;}}}return false;
}int hungary(int n){memset(link,-1,sizeof(link));int res = 0;for(int i = 0; i < n; ++i){memset(vis,0,sizeof(vis));if(dfs(i)) ++res;}return res;
}int g[maxn][maxn];
int is[maxn];
int main(){int n;while(cin >> n){for(int i = 0; i <= n; ++i){for(int j = 0; j <= n; ++j){g[i][j] = 0;}}int x,y,cnt;for(int i = 0; i < n; ++i){scanf("%d: (%d)",&x,&cnt);for(int j = 0; j < cnt; ++j){scanf("%d",&y);g[x][y] = 1;}}if(n == 1){puts("1");continue ;}for(int i = 0; i <= n; ++i) is[i] = 0,G[i].clear();for(int i = 0; i < n; ++i){for(int j = 0; j < n; ++j){if(g[i][j]){is[j] = 1 - is[i];}}}for(int i = 0; i < n; ++i){for(int j = i + 1; j < n; ++j){if(g[i][j] && is[i] != is[j]){G[i].push_back(j);}}}printf("%d\n",n - hungary(n));}return 0;
}

男生和女生(思维建图,最大独立集问题)相关推荐

  1. CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)

    题目链接:点击查看 题目大意:给出 nnn 个点(从 000 开始编号)和 mmm 条边的有向带权图,不过 mmm 条边是动态的,经过 ttt 秒后,第 iii 条边就从 ai−>bi,cia_ ...

  2. CodeForces - 1422D Returning Home(最短路+思维建图)

    题目链接:点击查看 题目大意:给出一个 n * n 的二维平面,现在要从点 ( sx , sy ) 到达点 ( fx , fy ),在平面上有 m 个传送门,共有两次操作: 向上.下.左.右移动一个单 ...

  3. ZZULIOJ 2131 Can Win【思维建图+最大流】

    2131: Can Win Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 479  Solved: 61 SubmitStatusWeb Board ...

  4. HDU 4725 层级最短路 思维建图 邻接表 堆优化迪杰斯特拉 真的难想 区域网络赛真题

    题目 题解思路 知道是最短路,怎么建图呢? 一开始想到每层来一个超级源点,但是方向不知道怎么确定,用双向边果然WA了(如果是双向边,那一层的都会变成0费连通了 ). 翻了翻 大佬的博客 大佬定义了一种 ...

  5. 2016 计蒜之道 复赛 菜鸟物流的运输网络【拆点+思维建图+网络流】

    菜鸟物流的运输网络 菜鸟物流有自己的运输网络,网络中包含 nn 个城市物流集散中心,和 mm 对城市之间的运输线路(线路是双向的).菜鸟物流允许淘宝卖家自行确定包裹的运输路径,但只有一条限制规则:不允 ...

  6. POJ - 1847 Tram 最短路,思维建图

    题目链接 POJ-1847 题意 给定n节点,节点之间有道路相连,但是每个节点都有个开关,只有开关指向的节点才能通行,你可以搬动开关.给定起点终点,求最少搬动开关次数. 解法 建图,对于每个节点,初始 ...

  7. abc302 F 思维建图+dij

    题意:给你n个集合,如果两个集合有公共元素,那么就可以合并,问你最小合并几次可以得到一个集合包含1和m. 思路:非常经典的套路建图,就是将集合和集合中的元素为两端,来建图.集合中的元素到集合的边权为1 ...

  8. 洛谷 - P1989 无向图三元环计数(思维建图)

    题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边组成的无向图,求三元环的个数 题目分析:对于原图建新图,对于原来的每条边来说 如果度数不同,度数小的点指向度数大的点 如果度数相同,编 ...

  9. P1989 无向图三元环计数 思维 + 建图

    传送门 文章目录 题意: 思路: 题意: 统计无向图中三元环的个数. 思路: 很明显有一种暴力的方法,就是枚举每条边,让后再跑两个点的所有边,可以卡到复杂度O(m2)O(m^2)O(m2). 我们可以 ...

最新文章

  1. vue中Axios的封装与API接口的管理详解
  2. pdo mysql分页_php运用PDO连接数据库,实现分页效果
  3. RocketMQ消息发送及消费的基本原理
  4. 微软推出《我的世界》“编程一小时”免费教程,携手Code.org普及计算机科学教育
  5. POJ1733,jzoj1779-Parity game(奇偶游戏)【带权并查集,离散化】
  6. mfc编程 孙鑫_孙鑫VC++视频教程笔记-(3)MFC程序框架的剖析 附1-SDI程序流程图
  7. 关于position定位下的各种属性说明!-softbar
  8. golang中的检验hash
  9. 【图像边缘检测】基于matlab GUI Sobel+Prewitt+Robert算子图像边缘检测【含Matlab源码 203期】
  10. 基于JAVA高校实习实训管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  11. List集合去重的常见几种方式
  12. 什么是磁盘?磁盘的组成?接口和分区?
  13. lpx寒假作业案例1
  14. 罗永浩、戴威的C位消亡史
  15. 阿里云ECS云服务器CPU处理器型号主频睿频实例规格表
  16. 李永乐老师讲一个量子计算机,别再只知道罗翔了!网上最受欢迎的14位老师,个个让人“开天眼”!...
  17. android 斜边_android自定义控件之中间是斜线的占比条
  18. 【深度学习】使用labelImg标注图像
  19. 介绍主密钥,传输秘钥,工作秘钥
  20. 猿创征文|国产数据库[StarRocks]实战学习

热门文章

  1. 深入理解计算机系统——知识总结
  2. 121.买股票的最佳时间
  3. 史蒂芬周博客打不开怎么办?
  4. oracle建库建表基础代码,oracle手工代码建库
  5. 生活啊生活。。。。。
  6. 用Python爬取我的微信好友昵称和头像,原来...
  7. 【MM】委外加工标准流程(Subcontracting)
  8. COCO数据集相关知识介绍
  9. java对视频进行截图
  10. 《手腕光电容积图智能手表对房颤检测的录制长度和其他心律失常的影响》阅读笔记