HDU2444 The Accomodation of Students【匈牙利算法】
题意:
有n个学生,有m对人是认识的,每一对认识的人能分到一间房,问能否把n个学生分成两部分,每部分内的学生互不认识,而两部分之间的学生认识。如果可以分成两部分,就算出房间最多需要多少间,否则就输出No。
思路:
判断是否是二分图,并输出最大匹配数。用'临点填色法'判断,相邻点异色,发现同色则不成立,然后匈牙利算法, 求出个数除2。注:匈牙利算法时间复杂度 '邻接表': O(mn),邻接矩阵: O(n^3)。
代码:
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; bool map[][];//连接图
bool visit[];//判断是否访问过
int link[];// 当前链接表
int judge[];// 判断二分图时 0-1表
int queue[];
int n,m; bool BFS()
{ //二分图BFS判断
int v,start = ,end = ;
queue[] = ;
for(int i=;i<=n;i++)
judge[i] = -;
v = queue[start];
judge[] = ;
memset(visit,,sizeof(visit));
while(start<end)
{
v= queue[start];
for(int i = ;i <= n; i++)
{
if(map[v][i])
{
if(judge[i] == -)
{
judge[i] = (judge[v]+)%;
queue[end++] = i;
}
else
{
if(judge[i] == judge[v])
return false;
}
}
}
start++;
}
return true;
} int maxmatch(int r)
{
for(int i=;i<=n;i++)
{
if(map[r][i] && visit[i] == )
{
visit[i] = ;
if(link[i]== || maxmatch(link[i]))
{
link[i] = r;
return ;
}
}
}
return ;
} int main()
{
while(cin>>n>>m)
{
memset(map,,sizeof(map));
int a,b;
for(int i=;i<m;i++)
{
cin>>a>>b;
map[a][b] = ;
map[b][a] = ;
}
//judge the bipartite graph
if(!BFS()) {
cout<<"No"<<endl;
continue;
}
//the maximum number of pair
int num = ;
memset(link,,sizeof(link));
for(int i=;i<=n;i++)
{
memset(visit,,sizeof(visit));
if(maxmatch(i)) num++;
}
cout<< num/ <<endl;
}
return ;
}
HDU2444 The Accomodation of Students【匈牙利算法】的更多相关文章
- HDU2444 The Accomodation of Students —— 二分图最大匹配
题目链接:https://vjudge.net/problem/HDU-2444 The Accomodation of Students Time Limit: 5000/1000 MS (Java ...
- HDU2444 The Accomodation of Students
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- hdu2444 The Accomodation of Students(推断二分匹配+最大匹配)
//推断是否为二分图:在无向图G中,假设存在奇数回路,则不是二分图.否则是二分图. //推断回路奇偶性:把相邻两点染成黑白两色.假设相邻两点出现颜色同样则存在奇数回路. 也就是非二分图. # incl ...
- HDU2444 The Accomodation of Students(二分图最大匹配)
有n个关系,他们之间某些人相互认识.这样的人有m对.你需要把人分成2组,使得每组人内部之间是相互不认识的.如果可以,就可以安排他们住宿了.安排住宿时,住在一个房间的两个人应该相互认识.最多的能有多少个 ...
- 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 - [二分图判断][匈牙利算法模板]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2444 Time Limit: 5000/1000 MS (Java/Others) Mem ...
- HDU 2444 The Accomodation of Students (偶图判定,匈牙利算法)
题意: 有一堆的学生关系,要将他们先分成两个组,同组的人都不互不认识,如果不能分2组,输出No.若能,则继续.在两组中挑两个认识的人(每组各1人)到一个双人房.输出需要多少个双人房? 思路: 先判定是 ...
- HDU 2444 The Accomodation of Students二分图判定和匈牙利算法
本题就是先推断能否够组成二分图,然后用匈牙利算法求出最大匹配. 究竟怎样学习一种新算法呢? 我也不知道什么方法是最佳的了,由于看书本和大牛们写的匈牙利算法具体分析,看了几乎相同两个小时没看懂,最后自己 ...
- 【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students
http://acm.hdu.edu.cn/showproblem.php?pid=2444 [DFS染色] #include<iostream> #include<cstdio&g ...
随机推荐
- 网页性能优化之异步加载js文件
一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...
- BZOJ2215[Poi2011]Conspiracy——2-SAT+tarjan缩点
题目描述 Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动.国王需要选一些人来进行这场运动,而这些人被分为两部分:一部分成为同谋者活动在被占领区域,另一部分是后勤组织在未被 ...
- BZOJ2588Count on a tree——LCA+主席树
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...
- IO模型介绍 以及同步异步阻塞非阻塞的区别
阻塞:用户进程访问数据时,如果未完成IO,等待IO操作完成或者进行系统调用来判断IO是否完成非阻塞:用户进程访问数据时,会马上返回一个状态值,无论是否完成 同步:用户进程发起IO(就绪判断)后,轮 ...
- codeforces 798 D. Mike and distribution
D. Mike and distribution time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- android 开发中 sdk 无法更新
现在用到android 的多个版本适配 , 换了个新环境 , 重新配置了android 的开发环境,哪想到遇到了很多小问题. 今天又遇到了 android sdk manager 无法更新的问题. ...
- 洛谷 P2764 最小路径覆盖问题 解题报告
P2764 最小路径覆盖问题 问题描述: 给定有向图\(G=(V,E)\).设\(P\) 是\(G\) 的一个简单路(顶点不相交)的集合.如果\(V\) 中每个顶点恰好在\(P\) 的一条路上,则称\ ...
- 洛谷 P1381 单词背诵 解题报告
P1381 单词背诵 题目描述 灵梦有\(n\)个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由\(m\)个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只 ...
- json序列化 & 反序列化
json序列化: json的dumps方法可以将json格式数据序列为python的相关数据类型,比如str,常用于打印,另外,在序列化时,中文汉字被转换为unicode编码,在dumps函数中添加参 ...
- Python条件控制与循环语句
1. 条件控制 # if-elif-else结构 age = 12 if age < 4: price = 0 elif age < 18: price = 5 else: price = ...