题意:

有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. 【POI每日题解 #6】KRA-The Disks

    题目链接 : [POI2006]KRA-The Disks 好有既视感啊... 注意一下输入输出 输入是从上到下输入箱子的宽度 输出是最上面的积木停在哪一层 即 箱子高度 - 积木高度 + 1 在初始 ...

  2. springmvc源码解析MvcNamespaceHandler之<mvc:view-resolvers>

    说在前面 本次主要介绍springmvc配置解析. springmvc配置解析 本次介绍MvcNamespaceHandler. 进入到这个方法org.springframework.web.serv ...

  3. 自学Aruba6.1-基本网络参数配置(web页面配置)

    点击返回:自学Aruba之路 自学Aruba6.1-基本网络参数配置(web页面配置) 1 配置VLAN 1.1  新建VLAN Configuration---VLANs中,VLANID选项卡下的A ...

  4. 洛谷 P4137 Rmq Problem /mex 解题报告

    P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后 ...

  5. py3+requests+urllib+bs4+threading,爬取斗图图片

    实现原理及思路请参考我的另外几篇爬虫实践博客 py3+urllib+bs4+反爬,20+行代码教你爬取豆瓣妹子图:http://www.cnblogs.com/UncleYong/p/6892688. ...

  6. Android原生(Native)C开发之四:SDL移植笔记

    http://www.apkbus.com/forum.php?mod=viewthread&tid=1989 SDL(Simple DirectMedia Layer)是一套开放源码的跨平台 ...

  7. Java中如何将字符串数组转换成字符串

    如果将“字符串数组”转换成“字符串”,只能通过循环,没有其他方法: public static String getExecSqlString(String str){ StringBuffer sb ...

  8. MyEclipse新建工作空间后的配置详细步骤

    1. General --> Workspace --> UTF-8 2. General --> Editors -->File  Associations --> J ...

  9. maven项目检出后报错(包括编译报错和运行报错)的常见检查处理方式

    maven项目检出后报错(包括编译报错和运行报错)的常见检查处理方式: 1.更改项目的jdk为我们安装的jdk2.更改build配置里的 output folder 目录为 xxx项目名/target ...

  10. SQL Server 2012/2016/2017 新增函数

    /************************************************************** SQL Server 2012 新增的函数 ************** ...