HDU 2444 The Accomodation of Students二分图判定和匈牙利算法
本题就是先推断能否够组成二分图,然后用匈牙利算法求出最大匹配。
究竟怎样学习一种新算法呢?
我也不知道什么方法是最佳的了,由于看书本和大牛们写的匈牙利算法具体分析,看了几乎相同两个小时没看懂,最后自己直接看代码,竟然不到半个小时看懂了。然后就能够直接拿来解题啦。
比方topcoder上有这个算法的非常具体的分析。真没看懂。
代码竟然比分析更清晰了?我也不好下结论。
可是我认为基本的思想还是有作用的。
说说我对这个算法的理解吧:
1 假设二分图分为两个集合 U, V,那么从一个集合U出发
2 U的一个点u连线到V的一个点v,假设v点没有别的点连接,那么就算连接成功了
3 假设v点有别的点u2连接了。那么就u2就须要让u连接,然后u2递归寻找别的路径点去连接。假设寻找成功找到v2。那么u2就连接v2;
4 假设u2没有找到别的点连接,那么u2就不让u了,所以u就不能连接v了。
5 那么u就继续寻找别的点连接,反复上述过程,直到u没找到别的点连接。那么u就是连接失败。继续下一个点查找。
就是一个递归查找的过程。
这位大牛的分析。我也是没看懂:https://www.byvoid.com/blog/hungary
可是能够參考他的图。然后依照我上面说的方法连接以下的图。保证你懂了:

本题C++程序:
bool isBipartite_2(vector<vector<bool> > & stus, int src)
{
vector<int> colors(stus.size(), -1);
colors[src] = 0;
queue<int> qu;
qu.push(src);
while (qu.size())
{
int u = qu.front();
qu.pop();
for (int v = 0; v < (int)stus.size(); v++)
{
if (stus[u][v] && colors[v] == -1)
{
colors[v] = 1 - colors[u];
qu.push(v);
}
else if (stus[u][v] && colors[v] == colors[u]) return false;
}
}
return true;
} bool hunDfs_2(vector<vector<bool> > &stus, vector<bool> &used,
vector<int> &linker, int src)
{
for (int d = 0; d < (int)stus.size(); d++)
{
if (stus[src][d] && !used[d])
{
used[d] = true;
if (linker[d] == -1 ||
hunDfs_2(stus, used, linker, linker[d]))
{
linker[d] = src;
return true;
}
}
}
return false;
} int hungary_2(vector<vector<bool> > &stus)
{
int res = 0;
vector<int> linker(stus.size(), -1);
for (int i = 0; i < (int)stus.size(); i++)
{
vector<bool> used(stus.size(), false);
if (hunDfs_2(stus, used, linker, i)) res++;
}
return res;
} int main()
{
int n, m, u, v;
while (scanf("%d %d", &n, &m) != EOF)
{
vector<vector<bool> > stus(n, vector<bool>(n, 0));
while (m--)
{
scanf("%d %d", &u, &v);
stus[u-1][v-1] = stus[v-1][u-1] = true;//记得:这是个无向图,否则错
}
if (isBipartite_2(stus, 0))
{
printf("%d\n", hungary_2(stus)>>1);
}
else puts("No");
}
return 0;
}
HDU 2444 The Accomodation of Students二分图判定和匈牙利算法的更多相关文章
- HDU 2444 The Accomodation of Students (偶图判定,匈牙利算法)
题意: 有一堆的学生关系,要将他们先分成两个组,同组的人都不互不认识,如果不能分2组,输出No.若能,则继续.在两组中挑两个认识的人(每组各1人)到一个双人房.输出需要多少个双人房? 思路: 先判定是 ...
- HDU 2444 The Accomodation of Students 二分图判定+最大匹配
题目来源:HDU 2444 The Accomodation of Students 题意:n个人能否够分成2组 每组的人不能相互认识 就是二分图判定 能够分成2组 每组选一个2个人认识能够去一个双人 ...
- 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 (二分图存在的判定以及最大匹配数)
There are a group of students. Some of them may know each other, while others don't. For example, A ...
- 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(二分图判定+最大匹配)
这是一个基础的二分图,题意比较好理解,给出n个人,其中有m对互不了解的人,先让我们判断能不能把这n对分成两部分,这就用到的二分图的判断方法了,二分图是没有由奇数条边构成环的图,这里用bfs染色法就可以 ...
- 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.hdu.edu.cn/showproblem.php?pid=2444 题意:首先判断所有的人可不可以分成互不认识的两部分.如果可以分成 ,则求两部分最多相互认识的对数. ...
- HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)
[题目链接]:pid=2444">click here~~ [题目大意]: 给出N个人和M对关系,表示a和b认识,把N个人分成两组,同组间随意俩人互不认识.若不能分成两组输出No,否则 ...
随机推荐
- C#.NET常见问题(FAQ)-Combobox如何设置不可以编辑
设置它的DropDownStyle为DropDownList即可 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123 ...
- 如何使用Total Recorder录制网上的音乐,如何下载只能试听的歌曲
1 在网上找到了对应的网站.其中正在播放的歌曲正是我们想要的 2 在地址栏输入上面音乐网站的网址,并点击捕获广播.(URL直接给出了音乐的完整地址,比如http://www.someserver.co ...
- 深夜闲聊节目:华为 Mate7的指纹识别安全么?
许久没有写过不论什么东西,近期非常忙并且还要准备找工作之类的,唉... ....今天的文章也不说技术,仅仅是闲聊. 一.手机指纹识别一揽 打开非常多站点.论坛的科技栏目,充斥着各种手机讯息!仿佛手机已 ...
- Python网络编程 - 一个简单的客户端Get请求程序
import socket target_host = "www.baidu.com" target_port = 80 # create a socket object clie ...
- secureCRT简单设置(学习笔记二)
菜鸟记录. 一.更改终端类型 选项-全局选项-默认会话-编辑默认设置-终端-仿真-右侧选择类型,下方设置缓冲区大小 二.设置字体和外观 上方窗口外观-右侧设置-字体设置字体类型大小,下面光标可以设置光 ...
- MySQL 联合索引测试3
接上一篇文章: http://www.cnblogs.com/xiaoit/p/4430387.html 有时候会出现某字段建立一个索引,但是查看执行计划的时候发现还是全扫了表? 可以强制走下索引看看 ...
- uploadify上传之前判断一个input输入框是否为空
onUploadStart:function(file){ if ($("#ContractCode").val() == "") { alert(" ...
- plsql 存储过程 测试
plsql 存储过程 测试 CreationTime--2018年8月14日09点54分 Author:Marydon 1.找到要运行的存储过程-->选中-->右键-->测试 2 ...
- 一些常见http状态码
# encoding=utf-8 #python 2.7.10 #xiaodeng #http状态码 #HTTP权威指南 10页 #一些常见状态码: 200 OK,文档正确返回 302 重定向,到其他 ...
- 关于highstock横坐标的一些的一些说明(1)使用UTC时间
highstock的数据格式采用的是[[时间,数据],[时间,数据],[时间,数据],[时间,数据]],而时间采用的是13位的毫秒值,如[1133136000000,69.66],采用的时间格式为UT ...