【Codeforces】CF 1082 G

Petya and Graph

#网络流 #图论 #最小割

题目描述

Petya has a simple graph (that is, a graph without loops or multiple edges) consisting of n n n vertices and m m m edges.

The weight of the i i i-th vertex is a i a_i ai.

The weight of the i i i-th edge is w i w_i wi.

A subgraph of a graph is some set of the graph vertices and some set of the graph edges. The set of edges must meet the condition: both ends of each edge from the set must belong to the chosen set of vertices.

The weight of a subgraph is the sum of the weights of its edges, minus the sum of the weights of its vertices. You need to find the maximum weight of subgraph of given graph. The given graph does not contain loops and multiple edges.

输入格式

The first line contains two numbers n n n and m m m ( 1 ≤ n ≤ 1 0 3 , 0 ≤ m ≤ 1 0 3 1 \le n \le 10^3, 0 \le m \le 10^3 1n103,0m103) - the number of vertices and edges in the graph, respectively.

The next line contains n n n integers a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,,an ( 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1ai109) - the weights of the vertices of the graph.

The following m m m lines contain edges: the i i i-e edge is defined by a triple of integers v i , u i , w i v_i, u_i, w_i vi,ui,wi ( 1 ≤ v i , u i ≤ n , 1 ≤ w i ≤ 1 0 9 , v i ≠ u i 1 \le v_i, u_i \le n, 1 \le w_i \le 10^9, v_i \neq u_i 1vi,uin,1wi109,vi=ui). This triple means that between the vertices v i v_i vi and u i u_i ui there is an edge of weight w i w_i wi. It is guaranteed that the graph does not contain loops and multiple edges.

输出格式

Print one integer — the maximum weight of the subgraph of the given graph.

样例 #1

样例输入 #1

4 5
1 5 2 2
1 3 4
1 4 4
3 4 5
3 2 2
4 2 2

样例输出 #1

8

解法

解题思路

首先这题边权的贡献是正的,点权的贡献是负的,并且边权的选择依赖与点权选择,其实就是一个最大权闭合子图的模型,如下:

有一堆物品,其中有正有负,其中正物品的选择必须选择负物品,求选择的贡献最大。

1. 1. 1.我们让负的物品连接上汇点 T T T,边权为物品的权重的绝对值,砍掉这条边表示为了选择正物品而不得不选上正物品。

2. 2. 2. 同时,让源点连接一个虚拟点 p p p,边权为物品的权重,砍掉这条边表示不选择这个物品。再让 p p p点连接上这个正物品依赖的所有负物品,权重为 i n f inf inf,表示不能砍掉这几条边。

3. 3. 3.最后,累加上所有的正权,减去最小割就是获得的最大权重了。

回到这道题,实际上我们把边权看为正物品,点权看为负物品,那么建图也是类似的了,比如以下的图:
![[Pasted image 20241014150303.png|400]]

建图后得到这样的图(省略权重):

![[Pasted image 20241014150258.png|500]]

我们跑一遍 D i n i c Dinic Dinic算法,使用边权之和减去最小割就是答案了。

代码

const int N = 5e4 + 10;struct edge {int u, v, c;
};vector<edge>e;
vector<int>h[N];
int d[N], cur[N];
int n, m, S, T,tot;
void add(int u, int v, int c) {e.push_back({ u,v,c });h[u].push_back(e.size()-1);e.push_back({ v, u, 0 });h[v].push_back(e.size() - 1);
}bool bfs() { //对点分层,找增广路memset(d, 0, sizeof d);queue<int>q;q.push(S); d[S] = 1;while (q.size()) {int u = q.front(); q.pop();for (int i = 0; i < h[u].size(); i++) {int j = h[u][i];int v = e[j].v, c = e[j].c;if (d[v] == 0 && c > 0) {d[v] = d[u] + 1;q.push(v);if (v == T)return true;}}}return false;
}int dfs(int u, int mf) { //多路增广if (u == T) return mf;int sum = 0;for (int i = cur[u]; i < h[u].size(); i++) {cur[u] = i; //记住u的当前弧int j = h[u][i];int v = e[j].v, c = e[j].c;if (d[v] == d[u] + 1 && c > 0) {int f = dfs(v, min(c, mf));e[j].c -= f;e[j ^ 1].c += f; //更新残留网sum += f;mf -= f;if (mf == 0)break;}}if (sum == 0)d[u] = 0;return sum;
}int dinic() {int res = 0;while (bfs()) {memset(cur, 0, sizeof cur);res += dfs(S, inf);}return res;
}int a[N];
void solve() {cin >> n >> m;tot = n+1;S = N - 1, T = N - 2;for (int i = 1; i <= n; ++i) {cin >> a[i];add(i, T, a[i]);}int sum = 0;for (int i = 1; i <= m; ++i) {int u, v, w;cin >> u >> v >> w;int p = ++tot;add(S, p, w);add(p, u, inf);add(p, v, inf);sum += w;}int t = dinic();int res = sum - t;std::cout << res << "\n";
}signed main() {ios::sync_with_stdio(0);std::cin.tie(0);std::cout.tie(0);int t = 1;//cin >> t;while (t--) {solve();}
}

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

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

相关文章

Qt入门教程:创建我的第一个小程序

本章教程&#xff0c;主要介绍如何编写一个简单的QT小程序。主要是介绍创建项目的过程。 一、打开QT软件编辑器 这里使用的是QT5.14.2版本的&#xff0c;安装教程参考以往教程&#xff1a;https://blog.csdn.net/qq_19309473/article/details/142907096 二、创建项目 到这里&am…

【Docker】03-自制镜像

1. 自制镜像 2. Dockerfile # 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["ja…

Flutter应用解析(一)

1、创建项目 1.1 新建 1.2 选择Flutter SDK的位置 1.3 项目名称 英文单词加下划线起名规范&#xff0c;其他默认即可。 1.4 点击运行 发生报错显示我们的JAVA版本不符合 1.5 更改版本设置 1.6 再次启动项目 2、分析页面代码 以下是lib/main.dart的源代码&#xff08;为了阅…

【机器学习】朴素贝叶斯算法|商品评论情感分析案例介绍及代码实现

文章目录 朴素贝叶斯算法朴素贝叶斯算法介绍概率数学基础复习朴素贝叶斯算法-利用概率值进行分类的一种机器学习算法贝叶斯公式朴素贝叶斯算法拉普拉斯平滑系数 朴素贝叶斯API案例分析流程数据集代码实现运行结果 朴素贝叶斯算法 朴素贝叶斯算法介绍 概率数学基础复习 条件概…

linux中通过一个命令启动任何java的jar包

由于需要在linux中需要启动N多个jar包,以下是写的一个通用脚本: #!/bin/bash if [ $# -ne 2 ]; then echo "用法: $0 <命令> <模块名称>" exit 1 fi MODEL_NAME=$2 APP_NAME="${MODEL_NAME}" echo $APP_NAME JARFILE="${MODEL_NA…

架构设计笔记-11-未来信息综合技术

知识要点 云原生架构原则包括&#xff1a;服务化原则、弹性原则、可观测原则、韧性原则、所有过程自动化原则、零信任原则和架构持续演进原则。 区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构&#xff0c;并以密码学方式保证的不可篡改和不可…

有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

Java 是一种复杂的编程语言&#xff0c;很长一段时间以来一直主导着许多生态系统。可移植性、自动垃圾回收及其温和的学习曲线是使其成为软件开发的绝佳选择的一些因素。但是&#xff0c;与任何其他编程语言一样&#xff0c;它仍然容易受到开发人员错误的影响。 本文探讨了 Jav…

CVE-2022-26965靶机渗透

​ 开启环境 ​ ​ 进入环境 ​ ​ 使用弱口令admin登录 ​ ​ 利用cms主题构造木马 ​ 需要将主题中的info.php文件修改&#xff0c;再打包成zip再上传&#xff0c;通过网络搜索找到Github中的Pluck CMS&#xff0c;进入后随便下载任一主题 https://github.com/sear…

c# using 声明进行资源管理

在 C# 8 中&#xff0c;using 声明引入了一种新的语法&#xff0c;称为 using 声明&#xff0c;它使得开发人员在处理资源时的代码更加简洁和清晰。主要的变化包括 使用声明 和 使用上下文&#xff08;using declaration&#xff09; 的引入。 使用语句的简化 在 C# 8 中&…

服务性能优化之mybatis-plus 开启与关闭 SQL 日志打印

Hello&#xff01;欢迎各位新老朋友来看小弟博客&#xff0c;祝大家事业顺利&#xff0c;财源广进&#xff01;&#xff01; 主题&#xff1a;mybatis-plus 开启与关闭 SQL 日志打印 第一&#xff1a;开启打印 Mybatis-plus 需要通过下面的方式开启控制台 SQL 日志打印 myba…

智能听诊器:宠物健康管理的革命

智能听诊器不仅仅是一个简单的监测工具&#xff0c;它代表了宠物健康管理的一次革命。通过收集和分析宠物的生理数据&#xff0c;智能听诊器能够帮助宠物主人和医生更好地理解宠物的健康需求&#xff0c;从而提供更加个性化的护理方案。 智能听诊器通过高精度的传感器&#xf…

和鲸科技创始人范向伟:拐点即将来临,AI产业当前的三个瓶颈

在科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑已经成为引领新一轮产业革命的核心动力之一。全球企业纷纷拥抱AI技术&#xff0c;试图借助其变革力量在竞争中突围&#xff0c;然而业界对AI产业化的拐点何时来临却众说纷纭。毕竟AI技术从实验室到商业…

4K变倍镜头特点

1、高分辨率成像&#xff1a; ① 能够呈现清晰、细腻的图像&#xff0c;可清晰快速地识别出被测物体的微小细节、特征以及潜在的缺陷等。例如在芯片外观瑕疵检测中&#xff0c;能清晰地分辨出芯片上的刮痕、污渍、破损、引脚缺失等问题。 ② 相比传统的变倍镜头&#xff0c;在…

【VUE】Vue的diff算法和React的diff算法

React和Vue都使用了虚拟DOM来进行高效的页面更新&#xff0c;但它们在实现细节上有一些差异。下面是React和Vue的diff算法的异同点&#xff1a; 异同点&#xff1a; 目标&#xff1a;React和Vue的diff算法的目标都是尽量减少DOM操作的次数&#xff0c;提高页面更新的性能。虚…

LabVIEW提高开发效率技巧----队列使用

在LabVIEW开发中&#xff0c;队列是实现并行处理、数据传递和任务调度的关键机制之一&#xff0c;合理使用队列可以有效提高程序性能并避免内存问题。结合队列长度限制和其他队列相关技巧&#xff0c;以下是队列使用的详细说明&#xff1a; 1. 队列长度限制 限制队列的长度可以…

全面讲解C++

数据类型 1.1 基本数据类型 1.1.1 整型&#xff08;Integer Types&#xff09; 整型用于表示整数值&#xff0c;分为以下几种类型&#xff1a; int&#xff1a;标准整数类型&#xff0c;通常为4字节&#xff08;32位&#xff09;。short&#xff1a;短整型&#xff0c;通常…

Python网络爬虫技术

Python网络爬虫技术详解 引言 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称网络蜘蛛&#xff08;Web Spider&#xff09;或网络机器人&#xff08;Web Robot&#xff09;&#xff0c;是一种按照一定规则自动抓取互联网信息的程序或脚本。它们通过遍历网页链…

JDK命令行工具

JDK命令行工具 1. jps&#xff1a;虚拟机进程状况工具 显示所有hotspot虚拟机进程 2. jstat&#xff1a;虚拟机统计信息监视工具 收集HotSpot各方面的运行数据&#xff0c;例如类装载&#xff0c;内存&#xff0c;垃圾收集&#xff0c;JIT编译等数据 3. jinfo&#xff1a;…

量子数字签名概述

我们都知道&#xff0c;基于量子力学原理研究密钥生成和使用的学科称为量子密码学。其内容包括了量子密钥分发、量子秘密共享、量子指纹识别、量子比特承诺、量子货币、秘密通信扩展量子密钥、量子安全计算、量子数字签名、量子隐性传态等。虽然各种技术发展的状态不同&#xf…

FreeRTOS学习总结

背景&#xff1a;在裸机开发上&#xff0c;有时候我们需要等待某个信号或者需要延迟时&#xff0c;CPU的运算是白白浪费掉了的&#xff0c;CPU的利用率并不高&#xff0c;我们希望当一个函数在等待的时候&#xff0c;可以去执行其他内容&#xff0c;提高CPU的效率&#xff0c;同…