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

网络流与二分图

时间:2023-07-18 21:57:32浏览次数:46  
标签:二分 必经 遍历 匹配 格子 网络 add 左部点

补不完。太多了。

CF1783F Double Sort II

先对排列建 \(a_i\to i\)。

交换 \(i\) 与 \(a_i\) 会使 \(a_i\) 原来所在环大小减 1,证明画图理解。最后需要变为 \(n\) 个自环。

把每个环集合抠出来,相当于每个环集合 \(S\) 中至少需要操作 \(|S|-1\) 个数。两个排列同理。

我们发现操作一些数会使两个排列中的环大小都减少,有些数只会影响一个排列,有些数不会影响。zrdz说过正难则反,考虑最大化最后一类数的个数,即选一些数使得任意两个不出现在同一个环中,或每个环的集合内至多选一个(两个排列都是),使选的数个数尽量多。

有点抽象

考虑网络流建模,原点连向 \(a\) 中的环,环连向环中点,点连向 \(b\) 中环, \(b\) 中环连向汇点。容量都是 1。流过一个数表示选它。这样就满足了每个环的集合内至多选一个且选了对两个排列均生效。

此时最大流即为最多的选的数的个数。答案即为 \(n-\) 最大流。

CF1773D Dominoes

先黑白染色建二分图,题目保证这时两边点数相等。设两边点数均为 \(k\)。

首先标记同一边的两个格子必然满足条件,方案数有 \(2\dfrac{k(k-1)}{2}=k(k-1)\),那么但凡 \(k(k-1)\ge 10^6\) 就不用做了。接下来考虑 \(k(k-1)<10^6\),差不多 \(k\le 10^3\)。

考虑左右各标记一个格子的情况,枚举左边格子并构造没有这个格子的新图,计算右边那些格子是二分图上的必经点(即任意最大匹配都经过的点),这些点就是标记掉以后满足条件的点。

关于最大匹配非必经点这个东西有一个结论:

先做一遍最大匹配,找出一种方案。

  • 从左边每一个非匹配点出发,遍历它的右部邻居。如果一个邻居 \(u\) 是匹配点,那么找出 \(u\) 对应匹配的左部点 \(v\) 并遍历它的右部邻居,重复该流程。所有遍历到的左部点都是非必经点。

原因还是比较好理解的。左部非匹配点一定是非必经点;每个遍历到的左部匹配点都存在以其为起点的一条增广路使得终点是一个左部非匹配点。翻转这条路上所有边的状态(匹配 $\to $ 不匹配,不匹配 \(\to\) 匹配)可得一个新的合法最大匹配,因此这条路径上所有左部点都是非必经点。

右部点同理。

一个方便一点的做法是跑一遍网络流,从 \(S\) 走 \(1\) 边遍历到的所有左部点即为非必经点, \(T\) 开始 \(0\) 边遍历到的所有右部点为非必经点。

必经点就是点数减非必经点。

CF1717F Madoka and The First Session

首先假设操作都是 \(u\to v\) 并模拟出最终结果。因为每反转一条边会使两个点权值减 2 / 加 2,不影响奇偶性,所以一旦奇偶性不同就寄。

然后我们的到了每个 \(s_i=1\) 的位置还需要加上的数 \(add_i\)。显然 \(add_i\equiv 0 \pmod 2\)。给每个 \(add_i\) 都除以 2。

这时以数为流量,看做网络流模型,操作一条边 \((v,u)\)(反向) 就是给 \(v\) 的权值减 1, \(u\) 的权值加 1。最后所有 \(s_i=1\) 的点均有一个流量限制 \(flow=add_i\),用上下界逃课。

有负数好处理,统一加上一个比较大的数 (比如 \(10^6\))就行了。

标签:二分,必经,遍历,匹配,格子,网络,add,左部点
From: https://www.cnblogs.com/jimmywang/p/17564232.html

相关文章

  • 网络流学习笔记
    网络流1.关于网络的一些定义:(1)网络:网络(又称流网络\(Flow\Network\))是指一个有向图\(\G=(V,E)\)。每条边\((u,v)\inE\)都有个权值\(c(u,v)\),称之为容量\((Capacity)\),\(\forall(u,v)\notinE,c(u,v)=0\).其中有两个特殊点:分别是源点\((Source)s\inV\)和汇点\((Sink......
  • Java根据原始URL获取网络重定向后的URL
    方法1:/***获取重定向地址*@parampath原地址*@return*@throwsException*/privateStringgetRedirectUrl(Stringpath)throwsException{HttpURLConnectionconn=(HttpURLConnection)newURL(path)......
  • openstack命令查看网络详情
    OpenStack命令查看网络详情作为一名经验丰富的开发者,我将向你介绍如何使用OpenStack命令查看网络详情。首先,让我们来整理一下整个流程。流程下面是使用OpenStack命令查看网络详情的步骤,我们将使用命令行界面:步骤描述步骤1登录到OpenStack环境步骤2列出可用的网络......
  • 深入理解 Socket 编程:网络通信的基石
    深入理解Socket编程:网络通信的基石引言在现代计算机网络中,网络通信是各种应用程序之间进行数据交换和信息传输的基础。Socket编程是实现网络通信的关键组件之一,它提供了一种方便而强大的方式,使得应用程序能够在不同计算机之间进行数据传输。本文将深入探讨Socket编程的基本......
  • 神经网络基础理解
    搜参搜的不够思考来源:https://www.bilibili.com/video/BV1ih411J7Kz?t=616.1&p=2中说“搜参搜的不够”在神经网络中,"搜参搜的不够"通常指的是通过随机搜索或优化算法来寻找神经网络的最佳超参数配置时,搜索空间覆盖不足的情况。神经网络的性能和效果很大程度上取决于其超参数的......
  • C++ 网络编程 asio 使用总结
    概述Asio是一个用于网络和低级I/O编程的跨平台C++库,它使用现代C++方法为开发人员提供一致的异步模型.io_contextio_context类为异步I/O对象的用户提供了核心I/O功能,包含:asio::ip::tcp::socketasio::ip::tcp::acceptorasio::ip::udp::socketasio::deadline_timer......
  • 二分查找
    二分查找本文的内容总结于该视频用二分查找来解决这四个问题时,边界条件很容易出错让我们从另一个角度来看这个问题:有红蓝两个指针,如何让这两个指针移动到各自的边界伪代码:对于上面的四种情况,我们只要控制IsBlue和要返回红色指针还是蓝色指针就可以做到以下是我用python......
  • 神经网络绘制工具大全
     目录1.LaTeX的tikz库2.ConvNetDraw3.Visio4.Inkscape-自由绘图5.Omnigraffle6.draw_convnet7.PlotNeuralNet8.NN-SVG9.Python+Graphviz10.Graphviz-dot11.Keras12、Netscope13.Caffe自带绘图工具14.TensorBoard15.NetworkX16.Bokeh1......
  • 在树莓派启动分区创建配置文件,使其加入无线网络
    在树莓派的启动分区创建一个名为“wpa_supplicant.conf”配置文件,在文件中输入以下内容:country=CNctrl_interface=DIR=/var/run/wpa_supplicantGROUP=netdevupdate_config=1network={ssid="xxx"psk="xxx"priority=5}ssid:指定要连接的无线网络psk:网络......
  • 大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解
    大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍1.大语言模型的预训练1.LLM预训练的基本概念预训练属于迁移学习的范畴。现有的神经网络在进行训练时,一般基于反向传播(BackPropagation,BP)算法,先对网络中的参数进行随机初始......