2279. 网络战争(最小割,01分数规划,二分)

活动 - AcWing

给出一个带权无向图 G=(V,E),每条边 e 有一个权 we。

求将点 s 和点 t 分开的一个边割集 C,使得该割集的平均边权最小,即最小化:

∑(e∈C)we/|C|

注意: 边割集的定义与最小割中的割边的集合不同。在本题中,一个边割集是指:将这些边删去之后,s 与 t 不再连通。

输入格式

第一行包含四个整数 n,m,s,t,其中 n,m 分别表示无向图的点数、边数。

接下来 m 行,每行包含三个整数 a,b,w,表示点 a 和 b 之间存在一条无向边,边权为 w。

点的编号从 1 到 n。

输出格式

输出一个实数,表示将点 s 和点 t 分开的边割集的最小平均边权。

结果保留两位小数。

数据范围

2≤n≤100,
1≤m≤400,
1≤w≤107
保证 s 和 t 之间连通。

输入样例:
6 8 1 6
1 2 3
1 3 3
2 4 2
2 5 2
3 4 2
3 5 2
5 6 3
4 6 3
输出样例:
2.00

解析: 

01分数规划:上一篇题解有详细讲解,361. 观光奶牛(小数二分,spfa判断正环,01分数规划)-CSDN博客。

 

本题要求的是∑(e∈C)we/|C| 的最小值。这种形式的问题基本都需要用到 01 分数规划。

现在取一个值 x,然后我们看一下 ∑(e∈C)we/|C| 和 x 的关系。

假设现在 ∑(e∈C)we/|C|>x,通过变形得到 ∑(e∈C)we−|C|⋅x>0,由于 ∑e∈Cwe 和 x 都有 |C| 个,因此进一步化简为 ∑e∈C(we−x)>0。

假设现在 ∑e∈Cwe|C|<x,同样可以得到 ∑e∈C(we−x)<0。

因此我们可以根据 ∑e∈C(we−x) 和 0 的关系来判断 ∑e∈Cwe|C| 和 x 的关系。而这个关系是有二段性的,是可以进行二分的。

在整个范围区间内进行二分,二分出的中间值就是 x,如果 ∑e∈C(we−x)>0,说明∑e∈Cwe|C|>x,继续二分右区间。否则说明 ∑e∈Cwe|C|<x,继续二分左区间。最终得到一个固定值,就是答案。

每次需要求出 ∑e∈C(we−x),我们可以建一个新图,将所有边都减去 x,在新图中求一个边割集的权值和就是 ∑e∈C(we−x)。

那么新图中可能存在 we−x≤0,对于这样的边,我们一定要选上,因为一个边割集若加上一些无法让图重新连上的边,它仍然是一个边割集,但是权值和会变小,所以这种负权值边必选。

现在已经选上所有非正边,我们需要考虑一下剩下的边该怎么选,因为边割集和流网络的割是不一样的,边割集在有流网络的割的所有边的同时,在这两个集合里面还有一些边,这些边去掉之后也能让整张图不连通,由于剩下要考虑的边都是正边,我们要让权值和越小,因此这两个集合里面的边尽量能不选就不选,因此在权值和最小的情况下,边割集一定不包含所有集合里面的边了,这时就是只剩下两个集合之间的边了,而这些边的权值和其实就是流网络的割。

通过以上的分析,我们成功将每个边割集的权值和与流网络的割的边的容量和对应起来。而边割集的最小权值和就是割的最小容量和,即最小割。

然后本题是无向图,而流网络中是有向图,我们需要将有向图和无向图对应起来,我们只需要正常建两条有向边,来回的流量会被抵消,而且流网络的割有一个特点就是保证正向边是满流反向边是 0 流,所以无向图的割等价于有向图的割,不需要额外处理。

然后这里每条无向边建两条有向边,有向边在残量网络中又有反向边,所以每条无向边都要建四条边,这里和前面的某一题一样直接合并成两条边即可。

最终得出本题算法,二分找最小值,每次求一遍最小割继续二分。

作者:小小_88
链接:https://www.acwing.com/solution/content/128176/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#include<unordered_set>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 1e4 + 5, M = 1e5 * 2 + 10, INF = 0x3f3f3f3f;
const double eps = 1e-8;
int n, m, S, T;
int h[N], e[M], w[M], ne[M], idx;
double f[M];
int q[N], d[N], cur[N];void add(int a, int b, int c) {e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;e[idx] = a, w[idx] = c, ne[idx] = h[b], h[b] = idx++;
}bool bfs() {int hh = 0, tt = 0;memset(d, -1, sizeof d);q[0] = S, d[S] = 0, cur[S] = h[S];while (hh <= tt) {int t = q[hh++];for (int i = h[t]; i != -1; i = ne[i]) {int j = e[i];if (d[j] == -1 && f[i]) {d[j] = d[t] + 1;cur[j] = h[j];if (j == T)return 1;q[++tt] = j;}}}return 0;
}double find(int u, double limit) {if (u == T)return limit;double flow=0;for (int i = cur[u]; i != -1 && flow < limit; i = ne[i]) {int j = e[i];cur[u] = i;if (d[j] == d[u] + 1 && f[i]) {double t = find(j, min(limit - flow, f[i]));if (!t)d[j] = -1;f[i] -= t, f[i ^ 1] += t, flow += t;}}return flow;
}double dinic(double mid) {double ret = 0;for (int i = 0; i < idx; i += 2) {if (w[i] <= mid) {ret += w[i] - mid;f[i] = f[i ^ 1] = 0;}else f[i] = f[i ^ 1] = w[i] - mid;}double r = 0, flow;while (bfs())while (flow = find(S, INF))r += flow;return r + ret;
}int main() {cin >> n >> m >> S >> T;memset(h, -1, sizeof h);for (int i = 1,a,b,c; i <= m; i++) {scanf("%d%d%d", &a, &b, &c);add(a, b, c);}double l = 0, r = 1e7;double mid;while (r - l > eps) {mid = (r + l) / 2;if (dinic(mid) < 0)r = mid;else l = mid;}printf("%.2lf\n", r);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/704730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…

在linux下配置网桥透明模式防火墙

在 Linux 下配置网桥透明模式防火墙&#xff0c;您可以使用 iptables 或者 nftables 来实现。下面是一个基本的示例&#xff0c;假设您已经有一个网桥 br0&#xff0c;并且想要在网桥上应用透明防火墙规则。 安装必要的工具&#xff1a; sudo apt update sudo apt install brid…

mybatis架构

分为三层&#xff1a;接口层、数据处理层、框架支撑层 那么展开解释每层职责 1.接口层&#xff1a;包含新增、删除、查询、修改接口。其调用方式大致分为两种&#xff1a;一种是基于statementId&#xff0c;一种是基于Mapper接口。另外还维护配置信息的接口 2.数据处理层&am…

Java SpringBoot 创建项目工程输出 Hello World

Java SpringBoot 创建项目工程输出 Hello World 1、新建项目 2、创建 controller 3、编写 Hello World 代码 package com.zhong.demo01.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.Res…

本地项目如何上传到gitee

文章目录 一、在gitee上新建远程仓库二、初始化本地仓库三、执行git命令上传代码 一、在gitee上新建远程仓库 仓库名称必填&#xff0c;路径自动跟仓库名称保持一致 解释说明&#xff1a; 仓库名称&#xff1a;必填&#xff0c;每个仓库都需要有一个名称&#xff0c;同一个码…

Armbian 23.11(Ubuntu 22.04)安装glances不显示docker容器状态解决办法

引流关键词&#xff1a; debian 系统环境信息 注意&#xff01;这里只是交代&#xff01;具体情况无需与我一致&#xff01; 命令输出cat /proc/versionLinux version 6.6.2-edge-rockchip64 (armbiannext) (aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, …

【Leetcode】150. 逆波兰表达式求值

今天做了一道leetcode&#xff0c;题目不算难&#xff0c;基本就是stack的入栈出栈&#xff0c;但我看了一圈别人的代码&#xff0c;感觉不够优雅&#xff0c;所以我想分享一下自己的写法&#xff0c;主要就是用Map和BiFunction优化4个if else Java中&#xff0c;函数是能以对…

kubectl 命令行管理K8S

目录 陈述式资源管理方式 介绍 命令 项目的生命周期 创建 kubectl create命令 发布 kubectl expose命令 更新 kubectl set 回滚 kubectl rollout 删除 kubectl delete 陈述式资源管理方式 介绍 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法…

2024年用AI自动直播有效果吗?

在如今全民直播的时代&#xff0c;做短视频和直播已经成为多数企业、实体店必备的技能之一&#xff0c;全国各个头部的品牌&#xff0c;都在纷纷加码直播&#xff0c;甚至已经开启直播矩阵的体系&#xff0c;另外中小型商家也在思考&#xff0c;如何通过抖音直播&#xff0c;让…

量子前沿:美国计算社区联盟CCC发布量子计算进展最新研报!

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;1800字丨12分钟阅读 近日&#xff0c;美国计算社区联盟 (CCC) 发布了过去五年量子计算进展的最新报告。CCC还分享了美国东北大学库里计算机科…

XGB-12:在 Kubernetes 上进行分布式 XGBoost 训练

通过 Kubeflow XGBoost Training Operator 支持在 Kubernetes 上进行分布式 XGBoost 训练和批量预测。 操作步骤 为在 Kubernetes 集群上运行 XGBoost 作业&#xff0c;执行以下步骤&#xff1a; 在 Kubernetes 集群上安装 XGBoost Operator。 XGBoost Operator 旨在管理 XGB…

从零开始学Spring Boot系列-Hello World

欢迎来到从零开始学Spring Boot的旅程&#xff01;我们将从一个非常基础但重要的示例开始&#xff1a;创建一个简单的Spring Boot应用程序&#xff0c;并输出“Hello World”。 1. 环境准备 首先&#xff0c;确保你的开发环境已经安装了以下工具&#xff1a; Java Development …

word、wps插入参考文献

word 首先为参考文献自定义一个编号列表&#xff0c;开始->有序编号->定义新的编号格式&#xff0c;如下图所示&#xff1a; 在输入编号的格式中输入编号列表的形式&#xff0c;然后输入1&#xff1b;将编号样式改为1&#xff0c;2&#xff0c;3形式&#xff0c;不然就会…

dbt-core中的模型

在dbt中&#xff0c;模型&#xff08;model&#xff09;是核心概念之一&#xff0c;它代表了一个或多个SQL查询&#xff0c;这些查询定义了如何从源数据转换和构建目标数据表。除了SQL模型外,还有一个python模型,这里后面再进行探索. 以下是一些关于dbt模型的主要概念和注意事…

趣学贝叶斯定理:贝叶斯定理的先验概率、似然和后验概率(2)

4. 比较非归一化的后验概率 首先&#xff0c;我们需要求出两个后验概率的比值 P ( D ∣ H 1 ) P ( D ∣ H 2 ) \frac{P(D|H1)}{P(D|H2)} P(D∣H2)P(D∣H1)​ 接下来&#xff0c;用贝叶斯定理将其中的每一项都展开。 所以这个后验概率比值告诉我们&#xff0c;在不知道P(D)的…

PostgreSQL 与MySQL 对比使用

一、前言 博主的系统既有 用到MySQL 也有用到PostgreSQL &#xff0c;之所以用到这两种数据库&#xff0c;主要是现在都是国产替代&#xff0c;虽然说这两款数据库也不是国产的&#xff0c;但是相对开源&#xff0c;oracle是不让用了。所以现在使用比较多的就是这两个关系型数据…

Java中文乱码问题几种常见的解决方法

Java中文乱码问题通常是因为字符编码不一致导致的。以下是几种常见的解决方法&#xff1a; 1. **设置JVM编码**&#xff1a;在启动Java程序时&#xff0c;可以通过-Dfile.encodingUTF-8参数来指定JVM使用的字符编码为UTF-8。例如&#xff1a; shell java -Dfile.encodin…

基于长短期神经网络的路径跟踪,基于长短期神经网络的路径预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络的路径跟踪,基于长短期神经网络的路径预测 MATALB代码:基于长短期神经网络的路径跟踪,基于长短期神经网络的路径预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc9918351…

Docker 命令 K8S 共享卷

目录 镜像VS容器 docker常用命令 docker ps -a docker images docker build -t docker run docker rm {containerid} docker rmi {imageid} Docker Compose 服务编排 docker-compose 常用命令 K8S Pod Kubernetes 中的 Pod&#xff1a; K8S共享卷 K8S跨Pod实…

cmake 构建Qt存在多个子项目的应用

概述&#xff1a;一般在开发UI应用时候我们都会存在多个子项目&#xff0c;比如一个是主UI界面的项目&#xff0c;有些动态库的项目&#xff0c;主UI中用到子项目中的动态库&#xff0c;我们来看看如何利用cmake来构建这样的一个工程&#xff0c;方便我们在跨平台中开发(macos、…