【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案例分析流程数据集代码实现运行结果 朴素贝叶斯算法 朴素贝叶斯算法介绍 概率数学基础复习 条件概…

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

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

CVE-2022-26965靶机渗透

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

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

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

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

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

4K变倍镜头特点

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

量子数字签名概述

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

FreeRTOS学习总结

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

windows修改文件最后修改时间

一、需要修改日期的文件 背景:有时候我们需要做一些文件定期删除的操作,但是测试时候并不一定有符合测试的文件,这时候就需要可以方便的修改文件的最后修改时间。 系统环境:windows 测试文件:如上 修改时间方式:windows 脚本。 二、测试脚本 (1) 脚本 # 指定文件路径 …

自然语言处理:第五十三章 Ollama

代码&#xff1a; ollama/ollama: Get up and running with Llama 3.1, Mistral, Gemma 2, and other large language models. (github.com) 官网&#xff1a; Ollama 写在前面: 笔者更新不易&#xff0c;希望走过路过点个关注和赞&#xff0c;笔芯!!! 写在前面: 笔者更新不易…

Android Framework默认授予app通知使用权限

安卓通知使用权限 在安卓系统中&#xff0c;应用程序需要获取通知使用权限才能向用户发送通知。以下是关于安卓通知使用权限的一些信息&#xff1a; 权限获取方式 当用户安装应用时&#xff0c;系统可能会在安装过程中提示用户授予应用通知权限。用户可以选择允许或拒绝。 应…

架构设计笔记-18-安全架构设计理论与实践

知识要点 常见的安全威胁&#xff1a; 信息泄露&#xff1a;信息被泄露或透露给某个非授权的实体。破坏信息的完整性&#xff1a;数据被非授权地进行增删、修改或破坏而受到损失。拒绝服务&#xff1a;对信息或其他资源的合法访问被无条件地阻止。攻击者向服务器发送大量垃圾…

OCM认证考试须知:掌握这些关键点,轻松应对考试

在Oracle认证体系中&#xff0c;OCM&#xff08;OracleCertifiedMaster&#xff09;是最高级别的认证。它代表了在Oracle数据库技术领域的顶尖水平。 OCM认证不仅要求你具备深厚的理论知识&#xff0c;还要求你能够解决复杂的数据库问题&#xff0c;并具备高级的项目管理能力。…

数据结构期中代码注意事项(二叉树及之前)1-11

注意&#xff1a;链表为空。是否越界访问。每写一步都要思考该步是否会有越界&#xff08;多/少&#xff09;等问题。这一步是否有不能走的条件&#xff08;删除的时候不为空&#xff09;。只有该节点开辟了空间&#xff0c;该节点才能被指向。能用c就用c。#include <iostre…

TensorRT-LLM七日谈 Day4

在Day2 中&#xff0c;我们梳理了trt-llm对于TinyLLama的调用&#xff0c;在Day3,我们也熟悉了一下Trt-llm常规的三步流程。 这里其实有个问题&#xff0c;在针对tiny-llama的部署中&#xff0c;其实没有显式的进行模型转换&#xff0c;那麽其推理接口中到底包含了什么&#x…