二分图最大匹配算法-匈牙利算法
2016-07-18 09:21
169 查看
二分图:把一个图G(V,E)的顶点集V划分为两个不相交顶点集 V1和 V2,且V=V1UV2,使得每一条边的顶点分别在V1 、V2 中。
未盖点:设u是图G的一个顶点,如果存在一条匹配边与u相关联,就称u是一个覆盖点,如果不存在这样的匹配边,则u就是一个未覆盖点。
交错路:设路径P是图G的一条路,如果P的任意两条相邻的边一定是一条属于M而另一条不属于M,就称P是一条交错路。
可增广路:两个端点都是未盖点的交错路叫做可增广路。
下面给出基于深度搜索的完美匹配算法-匈牙利算法:
未盖点:设u是图G的一个顶点,如果存在一条匹配边与u相关联,就称u是一个覆盖点,如果不存在这样的匹配边,则u就是一个未覆盖点。
交错路:设路径P是图G的一条路,如果P的任意两条相邻的边一定是一条属于M而另一条不属于M,就称P是一条交错路。
可增广路:两个端点都是未盖点的交错路叫做可增广路。
下面给出基于深度搜索的完美匹配算法-匈牙利算法:
#include<iostream> #include<cstring> using namespace std; bool graph[100][100]; int visit[100],flag[100]; int n1,n2,m; bool dfs(int x) { for(int i=1; i<=n2; i++) { if(graph[x][i]&&!visit[i]) //节点x与i之间存在边,且i不在增广路中 { visit[i]=1; //把i加入增广路; if(flag[i]==0||dfs(flag[i])) //i是未盖点 或者 从i的对应项出发有可增广路 { flag[i]=x; //修改i的对应项为x; return true; //则从x的对应项出有可增广路 } } } return false; //则从x的对应项出没有可增广路 } int main() { cin>>n1>>n2>>m; memset(graph,0,sizeof(graph)); for(int i=1; i<=m; i++) //矩阵表示二部图 { int x,y; cin>>x>>y; graph[x][y]=1; } memset(flag,0,sizeof(flag)); int count=0; for(int i=1; i<=n1; i++) { memset(visit,0,sizeof(visit)); if(dfs(i))count++; } cout<<"最大匹配边数:"<<count<<endl; cout<<"匹配边:"<<endl; for(int i=1;i<=n2;i++) if(flag[i]>0) cout<<"("<<flag[i]<<","<<i<<")"<<endl; return 0; }
相关文章推荐
- swagger整合spring mvc教程
- Error:java: javacTask: source release 1.8 requires target release 1.8
- 实现MyBatis Mapper XML文件增量动态刷新,自动加载,热加载,热部署
- 【风马一族_Android】手机与电脑通过adb进行连接
- C++ new失败的处理
- C++中如何理解cout endl
- inieditor基于注解的扩展使用(java读写.ini文件)
- css选择器总结
- 再议libcurl编程
- ExtJS4-客户端代理
- 【uva1502/hdu4117-GRE Words】DP+线段树优化+AC自动机
- mybatis的第一个程序
- javascript学习笔记之array.sort
- CentOS 6.5使用yum快速搭建LAMP环境
- CentOS7下PHP环境搭建
- windows多媒体定时器例程—C语言篇
- 手机APP测试之ADB常见问题解决方法
- mysql 函数 生成校验码
- C++中换行endl和\n的区别
- linux c:关联变量的双for循环