二分图匹配-匈牙利算法, 最小路径覆盖
二分图匹配-匈牙利算法
程序可以参考
http://blog.csdn.net/Fandywang_jlu/archive/2008/03/20/2201351.aspx
分析参考
http://imlazy.ycool.com/post.1603708.html
最小路径覆等价于二分图最大匹配, 具体的解释可以参考
http://hi.baidu.com/ufo008ahw/blog/item/363efdfd718e8443d7887de0.html
贴上程序
#include <memory.h>
int n, m, match[100]; //二分图的两个集合分别含有n和m个元素,match[i]存储集合m中的节点i在集合n中的匹配节点,初值为-1。
bool visited[100], map[100][100]; //map存储邻接矩阵。
bool DFS(const int &k)
{
for(int i = 0; i < m; i++)
if( map[k][i] && !visited[i] ) //有从k到i的边,并且i尚未访问过
{
visited[i] = true; //为什么不放在下面那个if里面??
if( match[i] == -1 || DFS(match[i]) ) //寻找是否为增广路径, i尚未有匹配边或者从i的匹配顶点一直找下去能成功,说明成功找到了一个增广路径,修改i的匹配点为k即可
{
match[i] = k; //路径取反操作。
return true;
}
}
return false;
}
int main(void)
{
// init map, n, m
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
map[i][j] = 0;
n=5; m=4;
int theEdge[][2]={
{0,0}, {0,1},{1,2},{3,1},{4,2}
};
int numEdge = sizeof(theEdge)/sizeof(theEdge[0]);
printf("numEdge %d\n", numEdge);
for(int i=0; i<numEdge; i++)
map[theEdge[i][0]][theEdge[i][1]] = 1;
//. DFS
int count = 0;
memset(match, -1, sizeof(match));
for(int i = 0; i < n; i++)
{ //以二分集中的较小集为n进行匹配较优
memset(visited, 0,sizeof(visited)); //每对一个节点i做dfs都要首先初始化visited数组
if( DFS(i) ) ++count; //count为匹配数
}
// print result
printf("num of matched: %d\n", count);
printf("the match table:\n");
for(int i=0; i<m; i++)
if(match[i] != -1)
printf("%d %d\n", match[i] , i);
//
return 0;
}
二分图匹配-匈牙利算法, 最小路径覆盖相关推荐
- nyoj-239 月老的难题 (二分图匹配—匈牙利算法 网络流—Dinic算法)
月老的难题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...
- 二分图匹配--匈牙利算法
文章目录 二分图: 匹配 匈牙利算法 代码: 二分图: 二分图是一个无向图,点集分成子集X和Y,图中每一条边都是一边在X一边在Y 当且仅当无向图G的每一个回路次数都是偶数时(包括0),G就是一个二分图 ...
- 二分图匹配匈牙利算法DFS实现
1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...
- 二分图匹配——匈牙利算法
匈牙利算法 什么是匈牙利算法 匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,并推动了后来的原始对偶方法.美国数学家哈罗德·库恩于1955年提出该算法.此算法之所以被称作匈牙利算法,是因 ...
- Codevs 1222 信与信封问题 二分图匹配,匈牙利算法
题目: http://codevs.cn/problem/1222/ 1222 信与信封问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 ...
- 二分图匹配-匈牙利算法
说到二分,我们就很容易想到二分查找算法,今年下半年--,今天所介绍的二分图和二分查找没有太大的联系,我们先来看一下它的定义: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图 ...
- 【CF1139E】Maximize Mex - 二分图匹配 - 匈牙利算法
[题目链接] https://www.luogu.com.cn/problem/CF1139E [题目描述] 有n个学生,第i个学生在俱乐部c_i,并拥有一个能力值a_i.在接下来的d天中,每天会有一 ...
- POJ1325二分匹配或者DINIC(最小路径覆盖)
题意: 有k个任务,两个机器,第一个机器有n个模式,第二个机器有m个模式,每个任务要么在第一个机器的一个模式下工作,要么在第二个机器的一个模式下工作,机器每切换一个模式需要重启一次,两个 ...
- HDU 2063 过山车 二分图匹配 匈牙利算法
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 二分图匹配----匈牙利算法之二
poj 1469 COURSES //题意:现在有p门课程和n个学生,现在需要有由p个学生组成的组织,该组织满足每个学生代表一门课程以及每门课程只能由一个学生代表, //现给出每门课程都有哪些学生可以 ...
最新文章
- 北信源IPO,拟筹资开发企业级云安全管理平台
- pytorch 加载模型 模型大小测试速度
- php文字超链接怎么写,php 文本URL转换为超链接功能实例
- apache动态编译/静态编译区别
- sqlliet 创建多表查询的视图_第4关 复杂查询
- 对话框的MFC,一点回车就退出
- Java多线程复习_Java多线程复习
- 信号与系统 chapter1 常见信号及其变换
- Android样式开发---shape
- 关于PHP的OpenSSL的加密问题
- HyperLedger Fabric 1.2 超级账本简介(5.2)
- 苹果Mac鼠标光标丢失如何找回?
- HDU-2036 改革春风吹满地 (多边形面积求解)
- 计算机论文物业管理系统,小区物业管理系统的设计与实现(计算机毕业设计)...
- 什么是测试开发工程师(SET)?
- python数据可视化-简单案例
- iOS集成twitter分享
- VR虚拟展厅产品展示如何实现的
- 2003服务器文件自动只读,windows 2003 文件夹只读,iis 无法写入的问题解决方法...
- 从国外的网站上下载包很慢的解决办法
热门文章
- outlook设置263邮件服务器,Outlook 2010中263邮箱客户端设置
- 深信服防火墙console波特率_[网络技术]深信服防火墙配置详细步骤 pdf文件[16.26MB]-码姐姐下载...
- 微信群发助手 及微信助手功能
- UML-包图中包与包之间的关系
- 新浪公司总裁兼首席执行官 曹国伟
- 交换机:广播风暴产生原因与解决方法、STP生成树协议 ,根桥(根交换机)、备份根桥、非根交换机、根端口、指定端口、非根非指定端口、桥ID
- 第6章 索引和数据完整性
- 计算机科学中的数学第一章答案,翻译《计算机科学与数学》第一章第四节:我们的公理...
- 【FACT】函数使用技巧
- newifi路由器 php,newifi路由器有线桥接教程