二部图 匈牙利算法
来源:互联网 发布:小米网上商城软件下载 编辑:程序博客网 时间:2024/04/28 05:13
匈牙利算法:http://www.renfei.org/blog/bipartite-matching.html
http://www.codeceo.com/article/bgraph-match-algorithm.html
http://dsqiu.iteye.com/blog/1689505
一道练习题: http://blog.sina.com.cn/s/blog_ac5ed4f30101ewjk.html
DFS:
#include <iostream>#include <cstring>using namespace std;#define MAX 501 int map[MAX][MAX]; int cx[MAX],cy[MAX]; bool vis[MAX]; int n,m; int path(int u){for (int v=1;v<=m;v++){ if (map[u][v]&&!vis[v]){vis[v]=1; if (cy[v]==-1||path(cy[v])) {cx[u]=v; cy[v]=u; return 1; }}}return 0; }int hungarian(){int ans=0; memset(cx,-1,sizeof(cx)); memset(cy,-1,sizeof(cy)); for (int i=1;i<=n;i++) { if (cx[i]==-1){memset(vis,0,sizeof(vis)); ans+=path(i); }}return ans; }int main(){int k,a,b; while (cin>>k>>n>>m){ memset(map,0,sizeof(map)); for (int i=0;i<k;i++){cin>>a>>b; map[a][b]=1; }cout<<hungarian()<<endl; }return 0; }
使用vector<int>::iterator迭代器
#include <iostream> #include <vector>#include <cstring> using namespace std; #define MAX 501 #define MAXK 1001typedef vector<int>::iterator iterator_t;vector<int>G[MAX]; int cx[MAX],cy[MAX]; bool vis[MAX]; int n,m,cnt; int path(int u) { for (iterator_t i=G[u].begin();i!=G[u].end();i++) { int v=*i; if (!vis[v]) { vis[v]=1; if (cy[v]==-1||path(cy[v])) { cx[u]=v; cy[v]=u; return 1; } } } return 0; } int hungarian() { int ans=0; memset(cx,-1,sizeof(cx)); memset(cy,-1,sizeof(cy)); for (int i=1;i<=n;i++) { if (cx[i]==-1) { memset(vis,0,sizeof(vis)); ans+=path(i); } } return ans; } int main() { int k,a,b; while (cin>>k>>n>>m) { for (int i=0;i<MAX;i++) G[i].clear(); cnt=0; for (int i=0;i<k;i++) { cin>>a>>b; G[a].push_back(b); } cout<<hungarian()<<endl; } return 0; }
链表结构:
#include <iostream> #include <cstring> using namespace std; #define MAX 501 #define MAXK 1001int head[MAX]; int cx[MAX],cy[MAX]; bool vis[MAX]; int n,m,cnt; struct node{int v,next; }edge[MAXK];void add(int u,int v){node E={v,head[u]}; edge[cnt]=E; head[u]=cnt++; } int path(int u) { for (int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if (!vis[v]) { vis[v]=1; if (cy[v]==-1||path(cy[v])) { cx[u]=v; cy[v]=u; return 1; } } } return 0; } int hungarian() { int ans=0; memset(cx,-1,sizeof(cx)); memset(cy,-1,sizeof(cy)); for (int i=1;i<=n;i++) { if (cx[i]==-1) { memset(vis,0,sizeof(vis)); ans+=path(i); } } return ans; } int main() { int k,a,b; while (cin>>k>>n>>m) { cnt=0; memset(head,0xff,sizeof(head)); for (int i=0;i<k;i++) { cin>>a>>b; add(a,b); } cout<<hungarian()<<endl; } return 0; }
0 0
- 二部图 匈牙利算法
- 二部图-匈牙利算法实现
- 二部图最大匹配--匈牙利算法
- 匈牙利算法 DFS 二部图的最大匹配
- 图的应用--二部图的判定及利用匈牙利算法求二部图的最大匹配
- 【图论】匈牙利算法与KM算法(寻找二部图最佳匹配与最佳完备匹配)
- poj 1325 Machine Schedule(二部图最小点覆盖集 最大匹配 匈牙利算法)(简单)
- (NYoj 237)游戏高手的烦恼 --二部图最大匹配,匈牙利算法
- (HDU 5727)Necklace <二部图匹配,匈牙利算法> 多校训练1
- 有关二部图KM算法的讨论
- POJ 2446 : Chessboard(二部图算法)
- 二部图
- 二分图匈牙利算法
- 二分图匈牙利算法
- 二分图 匈牙利算法
- 匈牙利算法 二分图
- 二分图 匈牙利算法
- 二分图---匈牙利算法
- 【51Nod 1294】修改数组
- **[Lintcode]Permutation Index II排列序号II
- 在职研一英语课件难句整理
- 一篇博文了解线程的同步
- GitHub 中国区前 100 名到底是什么样的人?
- 二部图 匈牙利算法
- 开发板烧录过程——如何在开发板上运行Hello.c
- ARP协议在同网段及跨网段下的工作原理
- 个人博客开发笔记
- 设备树中的结构体
- reflect
- Caffe学习笔记3——制作并训练自己的数据集
- CSS三栏布局的四种方法
- 使我的设备支持全Linux环境(解决设备的linux命令不全的问题)