标题已经说了,所以有基础的牛们就别想在这篇博客里看到什么有价值的东西。这里的解法是最基础的。

二分图是一种可以把图中的点分为两个不同的集合,且同一集合中不存在任意两个有边联通的点(就算是单向边也不行)的图。判断是否存在二分图有一个小技巧,如果有奇数条边的环,那么一定不存在二分图(相信可以自己想通)。至于最大匹配,就是选出尽量多的边,任意一个点只能与最多一条选中的的边相连。可以参照下面的图(a)。可能有人听说过“完美匹配”,就是说所有点都有在另一个集合中对应的点

二分图的最大匹配问题,与另一个同为网络流问题的最大流问题,都有一个“最大”,那么这之间是否有什么关系呢?答案是,真的有!那么现在先来了解一下有关最大流问题的的一些知识:https://blog.csdn.net/weixin_41811117/article/details/79677054。链接里的最大流用的也是基本解法。至于网络流是什么?也在链接里。

之前说过二分图最大匹配与最大流有点关系,其实思索一下就会发现,人为主动的在图中添加一个s点与一个t点,然后将左边的点都与s点建立一条权值为1的边,右边的点都与t点建立一条权值为1的边,且所有边都改成从左集合到右集合的有向边,原本图(a)的二分图这就成了图(b),一道经典的最大流问题。

优化


​ 但是由于多增了n条边,复杂度也上去了不少,所以我们就要进行一些优化。

​ 我们可以对增广路稍稍做点修改,但是本质还是一样的。从左开始遍历时按照【遍历了(左→右)-没遍历(右←左)-遍历了(左→右)-……】这个模式走奇数步(这样终点才会在右边的集合)。为什么可以这样优化哪?相信这个问题读者能自己想通,并不是很难。

模板代码(DFS版)


 
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define max 505
using namespace std;
int map[max][max],p[max],m,n,k,ans; //存储图 ,邻接矩阵,p数组记录集合2中的点所匹配的点的编号
bool vis[max]; //记录集合2中的每个点是否被搜索过
int read(){int ret=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();return  ret*f;
}
bool DFS(int x)  {  for(int i=1;i<=m;i++)  {  if(map[x][i]&&!vis[i]/*保证一个节点只经过一次*/)  {  vis[i]=1;  if(p[i]==0||DFS(p[i])){  p[i]=x;  return 1;  }  }  }  return 0;
}
void getanswer()  {  for(int i=1;i<=n;i++) {  memset(vis,0,sizeof(vis));//清空上次搜索留下的痕迹 ,以找长度大于1的增广路  if(DFS(i)) ans++;  //找到增广路,答案就加一 }return;
}
int main() {  freopen("ls.in","r",stdin);  memset(map,0,sizeof(map));  memset(p,0,sizeof(p));  n=read();m=read();k=read();//A、B集合元素的个数 for(int i=1;i<=k;i++){int x=read(),y=read();map[x][y]=1;//有向路 }getanswer();  if(!ans) printf("No Solution!\n");else printf("%d\n",ans);return 0;
}  

附上一道二分图匹配的模板题:Poj3041 http://poj.org/problem?id=3041

题目大意(大部分翻译来自google,所以看不懂中文是正常的):

小行星

时间限制: 1000MS   内存限制: 65536K
提交总数: 25001   通过: 13523

描述

贝茜希望通过一个N×N网格(1 <= N <= 500)形状的危险小行星带来驾驶她的飞船。网格包含K个小行星(1 <= K <= 10,000),它们位于网格的格点处。

幸运的是,贝茜拥有一个强大的武器,可以消除任意一行或一列中的所有小行星。这种武器非常昂贵,所以她希望少用一些。给定所有小行星的位置,输出贝茜需要射击以消除所有小行星的最少射击次数。

输入

*第1行:两个整数N和K,由一个空格隔开。 
*第2行... K + 1行:每行包含两个空格分隔的整数R和C(1 <= R,C <= N),分别表示小行星的行坐标和列坐标。

产量

*第1行:表示贝茜必须射击的最少次数的整数。

示例输入

3 4
1 1
1 3
2 2
3 2

1 1
1 3
2 2
3 2

示例输出

2

暗示

输入详细信息: 
下图表示数据,其中“X”是小行星和“.”是空的格子: 
X.X 
.X. 
.X.

输出细节: 
贝西可能在第1排开火,破坏(1,1)和(1,3)处的小行星,然后她可能击落第2列以破坏(2,2)和(3,2)处的小行星。

【题解】

我说过是模板题了。。。

感谢《算法竞赛_入门经典》的图

【网络流】基础二分图的最大匹配问题相关推荐

  1. 用匈牙利算法求二分图的最大匹配

    转载大神的!! 什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到.二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识):第二种就是我现在要讲的匈牙利算 ...

  2. 二分图的最大匹配 匈牙利算法

    基本概念 1.二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别 ...

  3. 「LibreOJ Round #11」Misaka Network 与测试 (网络流跑二分图匹配)

    description 研究者们想要测试 Misaka Network,于是他们把 Misaka Network 中的所有妹妹们召集到了一起. 现在妹妹们排成了 N行 M 列,有的位置没有人.现在研究 ...

  4. 网络流三·二分图多重匹配 HihoCoder - 1393

    网络流三·二分图多重匹配 HihoCoder - 1393 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int ma ...

  5. CF 277.5 B.BerSU Ball 二分图的最大匹配 模版题

    题意:求二分图的最大匹配数量 模版如下: //二分图匹配(匈牙利算法的DFS实现) //初始化:g[][]两边顶点的划分情况 //建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹 ...

  6. DAG的最小路径覆盖和二分图的最大匹配

    DAG的最小路径覆盖和二分图的最大匹配 DAG的最小路径覆盖是指找最小数目的互相不相交的有向路径,满足DAG的所有顶点都被覆盖. 首先给出公式:DAG的最小路径覆盖数=DAG图中的节点数-相应二分图中 ...

  7. POJ 2584 T-Shirt Gumbo (二分图多重最大匹配)

    题意 现在要将5种型号的衣服分发给n个参赛者,然后给出每个参赛者所需要的衣服的尺码的大小范围,在该尺码范围内的衣服该选手可以接受,再给出这5种型号衣服各自的数量,问是否存在一种分配方案使得每个选手都能 ...

  8. 二分图的最大匹配-解决匹配问题

    题目描述 题目描述 若两个正整数的和为素数,则这两个正整数称之为"素数伴侣",如2和5.6和13,它们能应用于通信加密.现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数 ...

  9. Jamie's Contact Groups ——(一对多)二分图多重最大匹配

    题目链接:http://poj.org/problem?id=2289 Jamie is a very popular girl and has quite a lot of friends, so ...

最新文章

  1. linux下查看cc攻击
  2. 第八章 Health Check
  3. arm下如何烧写指定分区大小的内核和文件系统
  4. android微信小程序支持横屏,微信小程序关于横屏存在的一些问题
  5. 逻辑卷备份mysql脚本_对MySQL进行逻辑卷备份与恢复
  6. 安卓应用安全指南 5.5.3 处理隐私数据 高级话题
  7. web服务器IIS详细错误代码以及解释
  8. mysql 交互式和非交互式操作(interactive_timeout和wait_timeout)
  9. 进共享服务器提示信号灯超时,移动硬盘提示说无法访问,信号灯超时,时间已到是为什么啊...
  10. Flask 推理模型,显存一直增长。
  11. WWW2023即将截稿
  12. Spring常用注解介绍 [附带代码]
  13. 【智能优化算法-白鲸优化算法】基于白鲸优化算法求解单目标优化问题附matlab代码
  14. 编写一个方法,将一段文本中的各个单词的字母顺序翻转题
  15. 前端框架,库,组件,插件,控件的理解
  16. 基金从业考试考前必背
  17. 与其被生活逼,不如被自己逼
  18. 2020上海全国计算机一级考试时间,2020全国等级计算机考试时间(全国计算机一级报名时间)...
  19. 【详解】二维数组的长度问题。int[][] arr = new arr[3][4];arr.length;arr[0].length;
  20. Windows 10 的中文用户名改成英文

热门文章

  1. android app防止锁屏_设置Android系统永不锁屏永不休眠的方法
  2. 子集和问题 算法_LeetCode 题解 | 78.子集
  3. Python 分数阶傅里叶变换
  4. FPGA-超声波避障小车(ego1)
  5. 差压传感器和差压变送器的区别在哪里
  6. CY3/Cy5/cy7/FITC/PEG/DBCO/BSA/PEI标记修饰纳米金球和纳米金棒的功能化修饰(Gold Nanoparticles)
  7. Haar小波提升算法
  8. 如何改变图片的像素大小
  9. 属性动画、帧动画、补间动画的介绍使用及对比
  10. [ZUCC 英语周测]Quiz B-3-7