题意:

有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【匈牙利算法】的更多相关文章

  1. HDU2444 The Accomodation of Students —— 二分图最大匹配

    题目链接:https://vjudge.net/problem/HDU-2444 The Accomodation of Students Time Limit: 5000/1000 MS (Java ...

  2. HDU2444 The Accomodation of Students

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  3. hdu2444 The Accomodation of Students(推断二分匹配+最大匹配)

    //推断是否为二分图:在无向图G中,假设存在奇数回路,则不是二分图.否则是二分图. //推断回路奇偶性:把相邻两点染成黑白两色.假设相邻两点出现颜色同样则存在奇数回路. 也就是非二分图. # incl ...

  4. HDU2444 The Accomodation of Students(二分图最大匹配)

    有n个关系,他们之间某些人相互认识.这样的人有m对.你需要把人分成2组,使得每组人内部之间是相互不认识的.如果可以,就可以安排他们住宿了.安排住宿时,住在一个房间的两个人应该相互认识.最多的能有多少个 ...

  5. hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  6. HDU 2444 - The Accomodation of Students - [二分图判断][匈牙利算法模板]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2444 Time Limit: 5000/1000 MS (Java/Others) Mem ...

  7. HDU 2444 The Accomodation of Students (偶图判定,匈牙利算法)

    题意: 有一堆的学生关系,要将他们先分成两个组,同组的人都不互不认识,如果不能分2组,输出No.若能,则继续.在两组中挑两个认识的人(每组各1人)到一个双人房.输出需要多少个双人房? 思路: 先判定是 ...

  8. HDU 2444 The Accomodation of Students二分图判定和匈牙利算法

    本题就是先推断能否够组成二分图,然后用匈牙利算法求出最大匹配. 究竟怎样学习一种新算法呢? 我也不知道什么方法是最佳的了,由于看书本和大牛们写的匈牙利算法具体分析,看了几乎相同两个小时没看懂,最后自己 ...

  9. 【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students

    http://acm.hdu.edu.cn/showproblem.php?pid=2444 [DFS染色] #include<iostream> #include<cstdio&g ...

随机推荐

  1. CnPack实用功能推荐

    已经使用CnPack好几年了,这个插件太好了,现在离开它我都不会写代码了,现在将使用心得与大家分享一下: 1.代码助手非常好用,只需要输入几个字符后,自动出现提示列表,真是懒人的福音呀. 2.代码高亮 ...

  2. multi_index_container 多索引容器

    multi_index_container是c++ boost库中的一个多索引的容器.因工作中用到了,特来测试试用. #include "stdafx.h" #include &q ...

  3. BZOJ3932[CQOI2015]任务查询系统——主席树

    题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第E ...

  4. DeBruijin HDU - 2894(????????)

    题意: 莫名其妙 看不懂..只能靠别人的题意混日子 a完就懂了  就是 POJ1392  不求第k个了  直接输出这个路径 emm ...就改了一下那个代码 #include <iostream ...

  5. day21 计算器作业

    import re express = '1 - 2 * ( ( 6 0 -3 0 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4 ...

  6. [luogu5008]逛庭院

    首先我们看到数据范围.妈耶!数据这么大,一开始还想用个DP来做,但是看着就不行,那么根据这个数据范围,我们大致可以猜到这道题的算法是一个贪心,那么我们怎么贪呢? 我们首先还是先画一个图: 样例解释一下 ...

  7. SharePoint 2013 Newsfeed 没有出现的解决方法

    按照这个guide配置mysite: http://technet.microsoft.com/en-us/library/ee624362(v=office.15).aspx 但是newsfeed页 ...

  8. 添加AD RMS role时,提示密码不能被验证The password could not be validated

    "The password could not be validated" when attempting to provision an AD RMS server. Sympt ...

  9. BZOJ3118 Orz the MST 【单纯形 + 生成树】

    题目链接 BZOJ3118 题解 少有的单纯形好题啊 我们先抽离出生成树 生成树中的边只可能减,其它边只可能加 对于不在生成树的边,其权值一定要比生成树中其端点之间的路径上所有的边都大 然后就是一个最 ...

  10. AT1219 歴史の研究 解题报告

    AT1219 歴史の研究 题意 给定一个长为\(n\)的序列\(\{a\}\),询问区间\(a*cnt_a\)的最大值,即某个值乘上出现次数 回退莫队板子 只右移右指针和左指针每次回到块结尾即可. C ...