HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)
【题目链接】: pid=2444">click here~~
【题目大意】:
给出N个人和M对关系,表示a和b认识,把N个人分成两组,同组间随意俩人互不认识。若不能分成两组输出No,否则输出两组间俩人互相认识的对数
【解题思路】: 先推断是否能构成二分图,推断二分图用交叉染色法:从某个未染色的点出发把此点染成白色,该点周围的点染成黑色。黑色周围的又染成白色。若走到某个点已经染色,而且它相邻点的颜色与它一样则不是二分图,能够这样理解,染白色既增加X集合,黑色既增加Y集合,若某个点即是X集合又是Y集合,那说明不是二分图,推断二分图之后,再求最大的匹配数。PS:二分图是无向图时最大匹配数是Sum/2。
代码:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector> #define rep(i,j,k) for(int i=(int)j;i<(int)k;++i)
#define per(i,j,k) for(int i=(int)j;i>(int)k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b? a:b
#define Min(a,b) a>b?b:a
#define mem(a,b) memset(a,b,sizeof(a)) int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
int movv[5][2]= {{1,0},{0,1},{0,0},{-1,0},{0,-1}}; using namespace std; typedef long long LL;
typedef unsigned long long LLU;
typedef double db;
const int inf=0x3f3f3f3f;
const int N =205; int head[N],link[N];///邻接表
bool vis[N],col[N];
int cnt,n,m; inline LL read()
{
int c=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
return c*f;
} struct edge{
int to;
int next;
}g[N*N]; void init(){
cnt=0;
mem(head,-1);
mem(col,0);
} void add_edge(int u,int v){
g[cnt].to=v;
g[cnt].next=head[u];
head[u]=cnt++;
} bool color(int u){ ///染色
for(int i=head[u]; i!=-1; i=g[i].next){
int v = g[i].to;
if(!col[v]){
col[v] = !col[u];
if(!color(v)) return false;
}
else if(col[v]==col[u]) return false;
}
return true;
} bool dfs(int u) ///匈牙利算法dfs实现
{
for(int i=head[u]; i!=-1; i=g[i].next){///元素集合个数
int v=g[i].to;
if(!vis[v]){
vis[v]=1;
if(link[v]== -1|| dfs(link[v])){
link[v]=u;
return true;
}
}
}
return false;
} int match() ///最大匹配
{
int ans = 0;
mem(link,-1);
for(int i=1; i<=n; ++i){
mem(vis,0);
if(dfs(i)) ans++;
}
return ans;
} int main()
{
while(~scanf("%d%d",&n,&m)){
if(n==1){
puts("No");
continue;
}
init();
while(m--){
int u,v;
u=read(),v=read();
add_edge(u,v);
add_edge(v,u);
}
col[1]=1;
if(!color(1)) puts("No");
else printf("%d\n",match()>>1);
}
return 0;
}
HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)的更多相关文章
- HDU 2444 The Accomodation of Students 二分图判定+最大匹配
题目来源:HDU 2444 The Accomodation of Students 题意:n个人能否够分成2组 每组的人不能相互认识 就是二分图判定 能够分成2组 每组选一个2个人认识能够去一个双人 ...
- hdu 2444 The Accomodation of Students(最大匹配 + 二分图判断)
http://acm.hdu.edu.cn/showproblem.php?pid=2444 The Accomodation of Students Time Limit:1000MS Me ...
- HDU 2444 The Accomodation of Students【二分图最大匹配问题】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2444 题意:首先判断所有的人可不可以分成互不认识的两部分.如果可以分成 ,则求两部分最多相互认识的对数. ...
- 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 (判断二分图,最大匹配)
The Accomodation of StudentsTime Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- 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(判断是否可图 + 二分图)
题目大意:有一群人他们有一些关系,比如A认识B, B认识C, 但是这并不意味值A和C认识.现在给你所有互相认识的学生,你的任务是把所有的学生分成两个一组, 住在一个双人房里.相互认识的同学可以住在一个 ...
- 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
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
随机推荐
- 优先队列priority_queue的使用
优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序. 每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储.例如:我们常用的操作就 ...
- 问题:Linux 输入任何命令都显示 -bash: fork: Cannot allocate memory
应该是某个程序吃掉了所有的内存,只能重启
- doT.js-doT模板方便快捷的组织页面DOM
重来没有想过,作为一个坐吃等死的前端也会有学习引擎模板的一天 都是被现实所逼呀.学习优秀代码时,一句一句翻译.忽然看到{{ }}这个包裹的代码.糟心了!看不懂,咋办?学呀!!!!!! 这是我开始学 ...
- RabbitMQ 消费端限流、TTL、死信队列
目录 消费端限流 1. 为什么要对消费端限流 2.限流的 api 讲解 3.如何对消费端进行限流 TTL 1.消息的 TTL 2.队列的 TTL 死信队列 实现死信队列步骤 总结 消费端限流 1. 为 ...
- SpringUtils写法
@Componentpublic class SpringUtils implements ApplicationContextAware { @Override public void setApp ...
- go 依赖包管理工具gb安装报错
尝试了下gb工具,发现有个问题: [root@etcd1 test]# go get github.com/constabulary/gb/... /home/gopath/src/github.co ...
- win10 sublime license
—– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...
- jquery 查找子元素的几种方法
<div class="tm-clear tb-hidden tm_brandAttr" id="J_BrandAttr" style="dis ...
- 老司机找bug的十年心路历程
一.码畜:靠编译器帮自己查语法错误 消灭笔误:编写适合程序猿的键盘练习 if (常量==变量或表达式) 使用goto接力超长的if,switch 连续的if还是if elseif 多个条件的组合:精心 ...
- BIEE11G系统数据源账号过期问题(默认安装步骤)
BIEE默认完毕安装后处于安全的考虑会对BI系统账户设定180天的有效期设置.例如以下图所看到的: 当账户超过时间后会自己主动口令失效.而造成BI系统启动失败.无法正常訪问等相关问题,到时候又一次设置 ...