匈牙利算法
来源:互联网 发布:linux口袋书 编辑:程序博客网 时间:2024/05/20 17:25
/* Name: 匈牙利算法 Copyright: Author: 巧若拙 Date: 12-06-17 10:52 Description: */#include <iostream>#include <math.h>using namespace std;#define MAX 502int map[MAX][MAX];int n,k;int mk[MAX];//从X集合中的顶点u出发用深度优先的策略寻找增广路//(这种增广路只能使当前的匹配数增加1)int nx,ny; //X和Y集合中顶点的个数int cx[MAX], cy[MAX];//cx[i]表示最终求得的最大匹配中与Xi匹配的Y顶点, cy[i]同理int Path(int u);int MaxMatch(); //求二部图最大匹配的匈牙利算法int main(){ int i,j; int a,b; cin >> n >> k; nx = ny = n; memset(map,0,sizeof(map)); for (i=0; i<k; i++) { cin >> a >> b; map[a][b] = 1; //表示Xa和Yb有连接 } int max=MaxMatch(); cout << max << endl; system("pause"); return 0;}int Path(int u){ for (int v=0; v<ny; v++) //考虑所有Yi顶点v { if (map[u][v]!=0 && mk[v]==0) { mk[v] = 1; //如果v没有匹配,或者如果v已经匹配了,但从y[v]出发可以找到一条新的增广路 if (cy[v]==-1 || Path(cy[v])) { cx[u] = v; //把v匹配给u cy[v] = u; //把u匹配给v return 1; //找到可增广路 } } } return 0 ; //如果不存在从u出发的增广路}int MaxMatch() //求二部图最大匹配的匈牙利算法{ int res=0; for(int i=0; i<MAX; ++i) //初始化列表 { cx[i] = cy[i] = -1; } for (int i=0; i<nx; i++) { if (cx[i] == -1) //从每个未盖点出发进行寻找增广路 { memset(mk, 0, sizeof(mk)); res += Path(i); //每找到一条增广路,可使得匹配数加1 } } return res;}
阅读全文
0 0
- 匈牙利算法
- 匈牙利算法!!!
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- Junit4 + MockMvc 进行单元测试,springboot controller单元测试
- 10.浏览器跨域问题.
- Kotlin教程(一):走进Kotlin的世界
- mui 安卓单页面下拉刷新问题
- AD按Value导出BOM
- 匈牙利算法
- 基与坐标系(阅读《理解矩阵》笔记)
- void类型及void指针
- linux命令中tar后跟的zxvf
- Android Tip: Java代码打印Android堆栈
- CSS之容器按比例缩放
- debug模式与relese模式下!
- NodeJs入门
- VC INI文件实现多语言版本