HDU - 2444 The Accomodation of Students(二分图判断+二分图最大匹配)
题目链接:点击查看
题目大意:给出n个学生,他们之间有m个认识关系,但认识关系不具有传递性,比如A认识B,B认识C,A不一定认识C,现在给出认识关系,先判断是否能够将所有学生分为两个集合A和B中去,集合A中的所有学生都互不认识,集合B中的学生也互不认识,集合A中的学生可以和集合B中的学生认识,若能分成两个集合,问最多有几个认识的关系
题目分析:看完题后再看了一眼样例,就是个模板题,二分图的判断我们交叉染色即可判断,分成两个集合后用匈牙利跑一下最大匹配就行了
代码:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=210;vector<int>node[N];int n,m;bool maze[N][N];int match[N];bool vis[N];int color[N];bool dfs1(int u,int f,int c)//交叉染色法
{color[u]=c;for(auto v:node[u]){if(v==f)continue;if(color[v]==-1&&!dfs1(v,u,!c))return false;else if(color[v]!=-1&&color[v]==c)return false;}return true;
}bool dfs(int x)//匈牙利算法
{for(int i=1;i<=n;i++){if(maze[x][i]&&!vis[i]){vis[i]=true;if(!match[i]||dfs(match[i])){match[i]=x;return true;}}}return false;
}void init()
{for(int i=1;i<=n;i++)node[i].clear();for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)maze[i][j]=false;memset(match,0,sizeof(match));memset(color,-1,sizeof(color));
}int main()
{
// freopen("input.txt","r",stdin);
// ios::sync_with_stdio(false);while(scanf("%d%d",&n,&m)!=EOF){init();while(m--){int u,v;scanf("%d%d",&u,&v);node[u].push_back(v);node[v].push_back(u);maze[u][v]=true;}if(!dfs1(1,0,0)){printf("No\n");continue;}int ans=0;for(int i=1;i<=n;i++){memset(vis,false,sizeof(vis));if(dfs(i))ans++;}printf("%d\n",ans);}return 0;
}
HDU - 2444 The Accomodation of Students(二分图判断+二分图最大匹配)相关推荐
- HDU 2444 The Accomodation of Students 二分图匹配
HDU 2444 The Accomodation of Students 二分图匹配 题目来源: HDU 题意: 给出学生数n和关系数m,接下来给出m个关系. 要求将学生分成两部分,每一部分不能有互 ...
- HDU 2444 The Accomodation of Students (二部图+染色)
The Accomodation of Students Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Ja ...
- HDU——2444 The Accomodation of Students
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- HDU - 2444——The Accomodation of Students(判断二分图,二分图最大匹配)
题意: 题意: 有n个人,m对人相互认识: 问能否分成两个组,组内任意两个人之间不认识: 若不能,则输出No: 若能,则相互认识的两个人一间房,求最多需要几间房: 给出一些学生的认识情况,比如A和B认 ...
- HDU 2444 The Accomodation of Students
首先是要构造二分图,然后二分图的最大匹配. 还有没完全证明过我的方法的正确性,但是AC了..... #include<cstdio> #include<cstring> #in ...
- 【HDU - 2444】The Accomodation of Students(二分图判断 + 匈牙利算法求最大匹配)
题干: There are a group of students. Some of them may know each other, while others don't. For example ...
- HDU 5971 2016ICPC大连 A: Wrestling Match(二分图判断)
题意:这题难在题意.. 因为题面太尴尬了所以直接转了吧,据说很多写法都能过 有n个点m条边的图,已知有x个点是黄色的,y个点是红色的(最后的x+y行输入的是这些点的编号) 问是否能将这个图转化成二分图 ...
- 二分图判断以及二分图最大匹配
概念 二分图又称作二部图 ,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的 ...
- 二分图判断(交叉染色)
二分图又称二部图. 二分图是无向图. 设G=(V,E)是一个无向图.如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集. 例如这就是一个二分图. 大概就是把顶点分成 ...
最新文章
- 一男子蒙冤入狱 10 天,竟是 AI 认错了!
- 在Python中的无参装饰器和有参装饰器
- android xml解析的三种方式
- 配置 aws cli_AWS CLI教程–如何安装,配置和使用AWS CLI了解您的资源环境
- 神仙在双11晚上,都干了些啥?
- 转转集团二手双11大促:长沙用户“秒杀”99新iPhone12成首单
- QML如何与C++交互
- 应用程序范围的键值对
- 浅分享一下zzulioj刷题总结
- 人大金仓数据库迁移步骤
- 8款逆天的在线实用工具
- 个人如何购买腾讯云服务器
- python多线程爬取美图录网站图集按模特姓名存储到本地(一)
- 从零搭建符合自己需求的开发环境
- 表观转录组学-m6A简介
- 二、什么是反射、反射可以做些什么
- 以太坊(一)——概述
- 第四次c语言实验报告模板,C语言实验报告模板完成版
- Python学习-批量提取图片名称保存至txt文件
- 2017 ICPC 乌鲁木齐