首页 > 其他分享 >二分图网络流选讲

二分图网络流选讲

时间:2024-08-28 10:48:02浏览次数:4  
标签:二分 匹配 增广 流选 vis 网络 back int

前言

完稿时间:2024.6.30

二分图网络流选讲

二分图

定义

  • 无向图
  • 节点可两集合
  • 每个集合中的节点互不连边

性质

  • 将两个集合中的点分别染成黑色和白色,可以发现二分图中的每一条边都一定是连接一个黑色点和一个白色点(废话)
  • 图中没有长度为奇数的环

证明性质2:因为每一条边都是从一个集合走到另一个集合,只有走偶数次才可能回到同一个集合。

二分图匹配

  • 匹配:有一个边集E,且E中的边都没有公共端点
  • 最大匹配:边最多的匹配
  • 完备匹配:所有点都有匹配点

增广路

增广路是一条非匹配边和匹配边交替的路径。增广路从非匹配边开始,非匹配边结束。

  • 增广路中边数为奇数
  • 将匹配边与非匹配边反转,则匹配边数+1

增广路定理:一个匹配是最大匹配当且仅当没有增广路

证明:如果存在就可以反转,匹配数可以+1与最大匹配矛盾

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

简述:不断在二分图里找增广路,反转匹配状态,直到找不出增广路。

算法流程

  • 枚举每个左部点,为它在右部找一个匹配点
  • 如果找到了还没被匹配过的点,那么匹配成功
  • 如果找到了已经被匹配过的点x,那么尝试为x匹配的点换一个匹配

代码

#define FL(i, a, b) for(int i = a; i <= b; i++)
int n, m, t, mat[N], ans;//mat[i]表示右边编号i匹配的左边节点
vector < int > g[N];
bool find(int u){
	for(int i = 0; i < g[u].size(); i++){
		int v = g[u][i];
		if(vis[v])continue; vis[v] = true;//去重
		if(!mat[v] or find(mat[v])){
			mat[v] = u;
			return true;
		}
	}
	return false;
}
int main(){
    ...
	FL(i, 1, n){//枚举左边的点
		memset(vis, false, sizeof vis);
		if(find(i))ans++;//匹配
	}
    cout << ans;
}

例题 P2071 座位安排

思路

人放左边,座位在右边,建模跑二分图最大匹配板子

代码

int main(){
	cin >> n; n *= 2;
    for(int i = 1, u, v; i <= n; ++i){
        cin >> u >> v;
        g[i].push_back(2 * u - 1);
        g[i].push_back(2 * u);
        g[i].push_back(2 * v - 1);
        g[i].push_back(2 * v);
    }
}

网络流

详见 网络流专题

标签:二分,匹配,增广,流选,vis,网络,back,int
From: https://www.cnblogs.com/Nekopedia/p/18384159

相关文章

  • 秃姐学AI系列之:残差网络 ResNet
    目录残差网络——ResNet残差块思想ResNet块细节ResNet架构总结代码实现残差块两种ResNet块的情况 ResNet模型QA由上图发现,只有当较复杂的函数类包含较小的函数类时,才能确保提高它们的性能。对于深度神经网络,如果我们能将新添加的层训练成恒等映射(identityfu......
  • 运维怎么转行网络安全?零基础入门到精通,收藏这一篇就够了
    经常有人问我:干网工、干运维多年遇瓶颈,想学点新技术给自己涨涨“身价”,应该怎么选择?聪明人早已经用脚投票:近年来,越来越多运维的朋友寻找新的职业发展机会,将目光聚焦到了网络安全产业。1、为什么我建议你学习网络安全?有一种技术人才:华为阿里平安等大厂抢着要,甚至高薪难求......
  • Android网络请求 |(一) 网络基础概念
    一、前端和后端 前端和后端通过接口交互。前端web端:使用的网页,打开的网站都是前端(使用html、css等语言)显示页面以及做一些简单的校验,比如说非空校验app端:android或者object-C(开发ios上的app)开发的app,后端在页面上操作的业务逻辑、功能如:后端控制购物的时候扣除的余额,......
  • Python数据采集与网络爬虫技术实训室解决方案
    在大数据与人工智能时代,数据采集与分析已成为企业决策、市场洞察、产品创新等领域不可或缺的一环。而Python,作为一门高效、易学的编程语言,凭借其强大的库支持和广泛的应用场景,在数据采集与网络爬虫领域展现出了非凡的潜力。唯众特此推出《Python数据采集与网络爬虫技术实训......
  • 计算机网络技术专业SDN(软件定义网络)实训室解决方案
    一、前言随着信息技术的飞速发展,网络架构正经历着前所未有的变革,其中软件定义网络(SDN,Software-DefinedNetworking)作为未来网络的核心技术之一,正逐步成为计算机网络技术专业教学与科研的重要方向。唯众,作为深耕职业教育领域的领先品牌,特推出针对计算机网络技术专业的SDN......
  • 捕获神经网络的精髓:深入探索PyTorch的torch.jit.trace方法
    标题:捕获神经网络的精髓:深入探索PyTorch的torch.jit.trace方法在深度学习领域,模型的部署和优化是至关重要的环节。PyTorch作为最受欢迎的深度学习框架之一,提供了多种工具来帮助开发者优化和部署模型。torch.jit.trace是PyTorch中用于模型追踪的一个重要方法,它能够将一个模......
  • D-二分
    最近做了一个CFround166的d题然后发现我并不会二分(虽然标答并不是二分)。故来写一下。题目:https://codeforces.com/contest/1976/problem/D首先观察到几个显而易见的性质:1.若要翻转[l,r],[l,r]中的(和)数量相等2.为了能和前面匹配上,翻转后[l,r]中未匹配右括号的(最大)数量要等于......
  • 网络爬虫中Fiddler抓取PC端网页数据包与手机端APP数据包
      Fiddler是常用的数据包捕获软件,具有分析请求数据、设置断点、调试web应用、修改请求的数据等功能,本文对如何用Fiddler抓取HTTP、HTTPS、手机APP数据包介绍了,另外还补充介绍了数据包过滤的功能。1引言在编写网络爬虫时,第一步(也是极为关键一步)就是对网络的请求(reque......
  • 网络爬虫之scrapy爬取某招聘网手机APP发布信息
      本文采用scrapy爬虫框架爬取前程无忧手机APP发布的招聘信息,重点对APP抓包分析、爬虫设计思路进行介绍。1引言        过段时间要开始找新工作了,爬取一些岗位信息来分析一下吧。目前主流的招聘网站包括前程无忧、智联、BOSS直聘、拉勾等等。有段时间时间没爬......
  • Linux网络:TCP & UDP socket
    Linux网络:TCP&UDPsocketsocket套接字sockaddr网络字节序IP地址转换bzeroUDPsocketsocketbindrecvfromsendtoTCPsocketsocketbindlistenconnectacceptsendrecv本博客讲解Linux下的TCP和UDP套接字编程。无论是创建套接字、绑定地址,还是发送和接收数据,......