二分图最大匹配匈牙利算法(poj)3041(模板)
来源:互联网 发布:高级软件架构师 编辑:程序博客网 时间:2024/04/29 08:49
给出一个图G=(V,E)
概念:
匹配:在图G中两两没有公共端点的边的集合
最大匹配:选出尽量多的边,使得任意两条选中的边均没有公共端点。
边覆盖:G中的任意顶点都至少是F中某条边的端点的边的集合
最小边覆盖:选出尽量少的边,使得G中的任意顶点都至少是选出的边的某个端点。
顶点覆盖:在图G中的任意边都有至少一个端点属于S的顶点集合。
最小顶点覆盖:选出尽量少的顶点,使得图G中的任意边都有至少一个端点属于S的顶点集合。
独立集:在G中两两互不相连的顶点集合。
最大独立集:选出尽量多的顶点,使得在G中两两互不相连、
定义:对于不存在独立点的图, 最大匹配 + 最小边覆盖 = E(所有边的集合)
定义:最大独立集 + 最小点集覆盖 = V(所有顶点集合)
定义:在二分图中,最大匹配 = 最小点集覆盖
二分图最大匹配:http://blog.csdn.net/y990041769/article/details/8812042
算法思想:从所有点出发,如果某个点还没有匹配,找与之相连的另一边没有匹配的点,如果都匹配了,那么找看能不能让其他的点增广到另一个点,把当前点让出来给这个点。
邻接表模板:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 1100;int V,m;int match[N];vector<int> map[N];bool used[N];void add_edge(int u,int v){ map[u].push_back(v); map[v].push_back(u);}bool dfs(int v){ used[v]=true; for(int i=0;i<map[v].size();i++) { int u=map[v][i],w=match[u]; if(w<0 || !used[w]&&dfs(w)) { match[v]=u; match[u]=v; return true; } } return false;}int bipartite_matchint(){ int res=0; memset(match,-1,sizeof(match)); for(int v=0;v<V;v++) { if(match[v]<0){ memset(used,0,sizeof(used)); if(dfs(v)) res++; } } return res;}int main(){ int n; while(~scanf("%d%d",&n,&m)) { V=2*n; for(int i=0;i<m;i++){ int x,y; scanf("%d%d",&x,&y); add_edge(x,n+y); } printf("%d\n",bipartite_matchint()); } return 0;}
邻接矩阵模板:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 1100;int n,m;int link[N],vis[N],map[N][N];bool dfs(int x){ for(int i=1; i<=n; i++) { if(map[x][i]==1 && vis[i]==0) { vis[i]=1; if(link[i]==0 || dfs(link[i])) { link[i]=x; return true; } //vis[i]=0; //搞不懂加上这个会超时 } } return false;}int bipartite_link() //求最大匹配{ memset(link,0,sizeof(link)); int count=0; for(int i=1; i<=n; i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) count++; } return count;}int main(){ while(~scanf("%d%d",&n,&m)) { memset(map,0,sizeof(map)); for(int i=0; i<m; i++) { int x,y; scanf("%d%d",&x,&y); map[x][y]=1; } printf("%d\n",bipartite_link()); } return 0;}
0 0
- 二分图最大匹配匈牙利算法(poj)3041(模板)
- 二分图最大匹配(匈牙利算法-DFS增广模板)
- 【匈牙利算法】二分图最大匹配(模板)
- POJ 1469 COURSES(匈牙利算法二分图最大匹配)
- 二分图最大匹配模板(匈牙利算法)
- 匈牙利算法模板 二分图最大匹配
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 匈牙利算法(二分图最大匹配)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 匈牙利算法(二分图最大匹配)
- java策略设计模式
- 一点一点学ASP.NET之基础概念——HttpHandler
- far与near的用法
- HDU 1394 Minimum Inversion Number (数据结构-线段树)
- 李开复谈创业失败十原因:经不住诱惑 直接山寨
- 二分图最大匹配匈牙利算法(poj)3041(模板)
- 64位windows7 上安装32位oracle 10g 的方法
- H型连衣裙 硬挺廓形上身就显瘦
- Unity3D NGUI 自适应屏幕
- Mac os x 终端设置IP DNS 相关命令 办公室、家里网络切换
- 2014省赛大总结(五) 区间查询二三事
- 风
- 李彦宏发内部邮件反思:鼓励狼性、淘汰小资
- reverseNnumber 几种方法