[网络流] 二分图匹配
来源:互联网 发布:拍照姿势的软件 编辑:程序博客网 时间:2024/05/18 15:23
二分图匹配,本质上是最大流问题的一种特殊情况。
指派问题
有N台计算机和K个任务,我们可以给每台计算机分配一个任务,每台计算机能够处理的任务种类各不相同,请求出最多能够处理的任务个数。
这个问题可以像下面这样转化为图论模型来分析。我们可以像下面这样来定义无向二分图
U是代表计算机的顶点集合,V是代表任务的顶点集合,对于任意
u∈U和v∈V 计算机u能够处理任务v⇒(u,v)∈E
而G中满足两两不含公共端点的边集合
图论术语中,我们将这种两两不含公共端点的边集合M称为匹配,而元素最多的M则成为最大匹配。而元素最多的M则成为最大匹配。当最大匹配的匹配数满足2|M| = V时,又称为完美匹配。特别地,二分图中的匹配又称为二分图匹配。向这道题一样,二分图匹配常常在指派问题的模型中出现,也常常在程序设计竞赛中登场。
可以将二分图最大匹配问题看成是最大流的一种特殊情况,对原图做如下变形:
将原图中的所有无相边
e 改为有向边,方向从U 到V ,容量为1 ,增加源点s 和汇点t ,从s 向所有的顶点u∈U 连一条容量为1的边,从所有的顶点v∈V 向t 连一条容量为1的边。
这样变形得到的新图中最大S-T流的流量就是原二分图G中最大匹配的匹配数,而U-V之间流量为正的边集合就是最大匹配。该算法的复杂度为
//此处省略了部分建边、寻找增广路和求解最大流的代码int N,K;bool can[MAXN][MAXN];// can[i][j]:计算机i能够处理任务jvoid solve(){ //0~N-1:计算机对应的顶点, //N~N-K+1:任务对应的顶点 int s = N+K,t = s+1; //在源点和计算机之间连边 for(int i = 0; i<N;i++) { add_edge(s, i, 1); } //在任务和汇点之间连边 for(int i = 0;i<K;i++) { add_edge(N+i,t,1); } //在计算机和任务之间连边 for(int i = 0; i < N; i++) { for(int j = 0; j < K; j++) { if (can[i][j]) { add_edge(i,N+j,1); } } } printf("%d\n",max_flow(s,t));}
0 0
- [网络流] 二分图匹配
- 【二分图匹配/网络流】宫廷守卫
- 【网络流/二分图匹配】飞行员配对
- 【网络流-二分图最大匹配】poj3041Asteroids
- 二分图最佳匹配(网络流)
- POJ1087(网络流,二分图匹配)
- 网络最大流、二分图最大匹配、POJ2536
- pku 3189 网络流|二分图多重匹配+枚举区间
- POJ3041 二分图最大匹配(网络流算法)
- 二分图最大匹配和网络最大流的转换
- Ural1109_Conference(二分图最大匹配/匈牙利算法/网络最大流)
- 11082 - Matrix Decompressing (网络流建模|二分图匹配)
- Uva 12549 Sentry Robots 网络流 - 二分图匹配
- HDU_3081_Marriage Match II(二分图完美匹配 / 网络流)
- 圆桌问题【二分图多重匹配】网络流24题
- uva11045(网络流 ,二分图匹配问题)
- 飞行员配对方案问题 网络流||二分图匹配
- POJ 1274 The Perfect Stall 网络流 二分图匹配
- hdu 2023 求平均成绩
- CSS笔记
- hdu2680 Choose the best route 最短路,超级起点(多源Dijkstra算法,)
- nyoj 75 日期计算
- MySql数据库主从同步配置
- [网络流] 二分图匹配
- CSU 1513 Kick the ball!
- 几个Linux distribution安装时可能用到的国内NTP server
- 数据结构(16)循环链表
- CentOS6下安装docker
- JavaScript笔记
- NYOJ 168 房间安排 (贪心)
- Mac git指令无法执行相关问题
- 【笔试】17、猴子吃桃问题