【CLYZ集训】变量取值【网络流】

news2024/11/15 12:17:35

在这里插入图片描述

思路:

容易把答案转化为 ∑ s i w i + ∑ t i ( w x − w y ) \sum{s_iw_i}+\sum{t_i(w_x-w_y)} siwi+ti(wxwy),然后我们设初始代价为 − ∑ ∣ s i ∣ w i -\sum{|s_i|w_i} siwi,然后考虑建模。
如果Si大于0,则源点向i连一条流量为2SiW的边,代表割掉这条边(也就是让i为w)要多付出的代价,向汇点连0的边。Si小于0,汇点向i连2SiW的边,向汇点连0的边。
然后对于wx-wy,则直接连2wti的双向边。
考虑限制,若果是<,则强制x和y的w,分别连inf边。
如果是=,则之间连inf边
如果是<=,则y向x连inf边。
然后做最小割就是答案。

c o d e code code

#include <iostream>
#include <cstdio>
#include <queue>
#include <cmath>
#include <cstring>
#define ll long long


using namespace std;

const ll MAXN = 550, inf = 1e12;

ll Q, tot;
ll n, w, p, q, S, T;
ll s[MAXN * 3], a[MAXN * 3];
ll crn[MAXN * 3], dep[MAXN * 3], head[MAXN * 3];
struct edge {
    ll to, next, w, op;
} b[MAXN * MAXN * 21];
ll MB[MAXN][MAXN];
queue<ll> G;

void add(ll x, ll y, ll w) {
    b[++tot] = (edge){ y, head[x], w, tot + 1 };
    head[x] = tot;
    b[++tot] = (edge){ x, head[y], 0, tot - 1 };
    head[y] = tot;
}

bool bfs() {
    for (int i = 1; i <= T; i++) crn[i] = head[i], dep[i] = 0;
    while (!G.empty()) G.pop();
    G.push(S);
    dep[S] = 1;
    while (!G.empty()) {
        int now = G.front();
        G.pop();
        for (int i = head[now]; i; i = b[i].next)
            if (b[i].w && !dep[b[i].to]) {
                dep[b[i].to] = dep[now] + 1;
                if (b[i].to == T)
                    return 1;
                G.push(b[i].to);
            }
    }
    return 0;
}
/*
ll dfs(ll x, ll flo) {
        if(x == T) return flo;
        ll d = flo;
        for(ll i = crn[x]; i; i = b[i].next) {
                crn[x] = b[i].next;
                ll y = b[i].to;
                if(dep[y] == dep[x] + 1 && b[i].w > 0) {
                        ll tmp = dfs(y, min(d, b[i].w));
                        b[i].w -= tmp;
                        b[i ^ 1].w += tmp;
                        d -= tmp;
                        if(d == 0) break;
                }
        }
        return flo - d;
}
*/

ll dfs(int now, ll sum) {
    if (now == T)
        return sum;
    ll go = 0;
    for (int i = crn[now]; i; i = b[i].next)
        if (b[i].w && dep[now] + 1 == dep[b[i].to]) {
            ll this_go = dfs(b[i].to, min(sum - go, b[i].w));
            if (this_go) {
                b[i].w -= this_go;
                b[b[i].op].w += this_go;
                go += this_go;
                if (go == sum)
                    return go;
            }
        }
    dep[now] = -1;
    return go;
}

ll dinic() {
    ll ans = 0;
    while (bfs()) {
        ans += dfs(S, 1e18);
    }
    return ans;
}

void clean() {
    tot = 0;
    memset(head, 0, sizeof(head));
    memset(MB, 0, sizeof(MB));
    memset(b, 0, sizeof(b));
    memset(s, 0, sizeof(s));
}

int main() {
    freopen("variable.in", "r", stdin);
    freopen("variable.out", "w", stdout);
    scanf("%lld", &Q);
    while (Q--) {
        scanf("%lld%lld%lld%lld", &n, &w, &p, &q);
        for (ll i = 1; i <= n; i++) s[i] = 1;
        S = n + 1, T = n + 2;
        for (ll i = 1; i <= p; i++) {
            ll r1, r2, r3, r4, r5, r6, r7, r8, r9;
            scanf("%lld%lld%lld%lld%lld%lld%lld%lld%lld", &r1, &r2, &r3, &r4, &r5, &r6, &r7, &r8, &r9);
            MB[r1][r2] += r4;
            MB[r2][r3] += r5;
            MB[r3][r1] += r6;
            s[r1] += r7 - r9, s[r2] += r8 - r7, s[r3] += r9 - r8;
        }
        ll low = 0;
        for (ll i = 1; i <= n; i++) {
            low += abs(s[i]);
            if (s[i] > 0)
                add(S, i, 2 * s[i]);
            if (s[i] < 0)
                add(i, T, -2 * s[i]);
            for (int j = i + 1; j <= n; j++) {
                if (MB[i][j] + MB[j][i])
                    add(i, j, MB[i][j] * 2 + MB[j][i] * 2), add(j, i, MB[i][j] * 2 + MB[j][i] * 2);
            }
        }
        for (ll i = 1; i <= q; i++) {
            ll r1, r2, r3;
            scanf("%lld%lld%lld", &r1, &r2, &r3);
            if (r3 == 0)
                add(r2, r1, inf);
            if (r3 == 1)
                add(r1, r2, inf), add(r2, r1, inf);
            if (r3 == 2)
                add(S, r1, inf), add(r2, T, inf);
        }
        printf("%lld\n", dinic() * w - low * w);
        clean();
    }
    return 0;
}

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

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

相关文章

【Java AWT 图形界面编程】FileDialog 对话框 ( 打开文件 | 保存文件 | 构造函数 | 获取文件路径 | 获取文件名称 | 代码示例 )

文章目录一、FileDialog 对话框1、构造函数2、获取文件路径3、获取文件名称二、FileDialog 对话框代码示例一、FileDialog 对话框 在开发时 , 经常遇到文件相关操作 , 如 : 选择文件 , 保存文件 等 , 在 AWT 中使用 FileDialog 文件对话框 实现上述功能 ; 1、构造函数 FileDial…

量子计算初创公司Oxford Ionics完成3000万英镑A轮融资

&#xff08;图片来源&#xff1a;网络&#xff09;未来&#xff0c;量子计算机会解决世界上最大的超级计算机无法解决的问题。然而&#xff0c;大规模制造量子计算机仍然是一个巨大的挑战。英国量子计算初创公司Oxford IonicsA轮融资获得的3000万英镑&#xff08;约合人民币2.…

Java集合(六)Set接口和常用方法

Set接口基本介绍&#xff1a; &#xff08;1&#xff09;无序&#xff08;添加和取出的顺序不一致&#xff09;&#xff0c;没有索引 &#xff08;2&#xff09;不允许重复元素&#xff0c;所以最多包含一个null (3)JDK API中Set接口的实现类有&#xff1a; 其中set接口的已…

2023年,最新最权威的上海Java培训机构排行榜出炉!

2022也许你的很多学习和工作计划都被打乱&#xff0c;但是过去的2022不管多艰难&#xff0c;多难熬。都已经成为过去式。2023悄然而至&#xff0c;新的一年&#xff0c;你我都该有新气象新动力&#xff0c;学习什么时候开始都不晚&#xff0c;想跨行从事软件开发、IT行业的小伙…

跳槽至今0 offer的大冤种,问题到底出在哪儿?

众所周知&#xff0c;2022年市场很难&#xff01;看着企业们纷纷裁员&#xff0c;甚至连内推这个后门都走不通&#xff01;哪怕有面试&#xff0c;都是屡屡碰壁&#xff0c;你想清楚问题出在哪了吗&#xff1f;&#x1f62d;“求职不得&#xff0c;夜不能寐&#xff1b;三更半夜…

C++基础——C++ 指针

C基础——C 指针C 指针什么是指针&#xff1f;C 中使用指针C 指针详解C Null 指针C 指针的算术运算递增一个指针递减一个指针指针的比较C 指针 vs 数组C 指向指针的指针&#xff08;多级间接寻址&#xff09;C 传递指针给函数C 指针 学习 C 的指针既简单又有趣。通过指针&…

Python语言基础学习之Python基础之列表介绍和循环遍历

今天给大家分享一些Python基础 (列表基础和循环遍历介绍)&#xff0c;一起来看看吧~ 一、列表介绍 想一想&#xff1a; 字符串可以用来存储一串信息&#xff0c;那么想一想&#xff0c;怎样存储所有同学的名字呢?定义100个变量&#xff0c;每个变量存放一个学生的姓名可行吗…

LinkedList VS ArrayList~

ArrayList VS LinkedList: One: ArrayList:基于数组&#xff0c;需要连续内存LinkedList:基于双向链表&#xff0c;无需连续内存Two: ArrayList:随机访问快(指根据下标访问)LinkedList:随机访问慢(要沿着链表遍历)点击ArrayList的源码: 点击LinkedList的源码&#xff1a; Ar…

九龙证券|看好2-4月份汽车月度销量增速的逐月改善

机构指出&#xff0c;考虑到22年末购置税补助等方针到期&#xff0c;叠加春节假期消费需求的提早&#xff0c;估计年内乘用车销量绝对值及同比增速均于1月触底&#xff0c;后续方针影响、消费回暖等一期效果下&#xff0c;看好车市回暖&#xff0c;估计销量增速将于2-4月逐月回…

15.Set系列,可变参数、Collections

目录 一.Set系列 1.1 Set系列集合特点 1.2 Set集合实现类特点 1.3 HashSet 1.3.1 特点 1.3.2 优点 1.3.3 在理解原理之前要知道的几个概念。 1.3.4 底层原理 1.3.5 哈希表的形成过程/元素的存入过程&#xff08;Jdk8的版本&#xff09; 1.3.6 注意事项 1.4 linkedHa…

通用数字支付网络(UDPN)于达沃斯论坛期间正式发布

2023年1月19日&#xff0c;在瑞士达沃斯举行的世界经济论坛 (WEF) 会议期间&#xff0c;通用数字支付网络 (Universal Digital Payment Network, UDPN)正式对外发布。 近年来&#xff0c;全球各国央行数字货币&#xff08;CBDC&#xff09;得到了广泛的关注与长足的进步&#…

WebHooks

webhook 究竟是什么呢&#xff1f; Webhook是一个API概念&#xff0c;webhoo是一种web回调或者http的push API。Webhook作为一个轻量的事件处理应用&#xff0c;正变得越来越有用。 具体的说&#xff0c;webhook 是应用给其它应用提供实时信息的一种方式。信息一产生&#xf…

Js如何实现当网页超过一屏时导航菜单始终置顶-吸顶盒效果

前言我们平时在逛一些电商网站时,无论是首页还是详情页,通常会有一个导航菜单石红跟随着页面,无论是页面滚动到中间还是底部这是为了方便用户查看商品的各类信息或提交订单购物也就是吸顶盒效果,那这个效果是怎么实现的?原生Js如下是原生js// 初始化函数 function init() {// …

[Pytorch] CIFAR-10数据集的训练和模型优化

本篇文章借鉴了我的朋友Jc的报告&#xff0c;他是一个十分优秀的人。 本篇文章记录了第一次完整训练优化的过程 0 关于数据集 在CIFAR-10 dataset的介绍中&#xff0c;cifar-10数据集一共10类图片&#xff0c;每一类有6000张图片&#xff0c;加起来就是60000张图片&#xff0…

深度卷积对抗神经网络 基础 第五部分 Inception-v3 architecture GANs

深度卷积对抗神经网络 基础 第五部分 Inception-v3 architecture GANs 对抗神经网络能够产生不存在的图片&#xff0c;换脸或者生成一些艺术品&#xff0c;这些有趣和强大的对抗神经网络的能力不仅能够创造价值&#xff0c;还能够用来犯罪。With Great Power , Comes With Res…

3.1.1 类和对象

文章目录1.类2.对象3.类和对象的关系4.类的创建使用5.对象在内存中的存储过程6.对象创建过程分析1.类 java最基本的单位就是类&#xff0c;可以理解为类型类是一类事物的抽象可以理解为模板或者设计图纸 注意:类在现实世界并不存在,它只是一种对象的数据类型。例如乌鸦&#…

如何使用DevExpress WPF组件实现异步加载TreeList节点?建议收藏

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。在本文中&#xff0c;我…

PADS Layout封装创建时批量放置焊盘的方法

批量放置焊盘一般是在BGA封装的是用的比较多&#xff0c;当然对于一些普通贴片焊盘也是挺常用的。 1、第一步&#xff1a;打开PCB封装编辑器&#xff0c;进入到封装编辑界面&#xff0c;放置焊盘后&#xff0c;点击焊盘右键“分步与重复”既可。2、第二步&#xff1a;点击以后弹…

常见的锁策略和synchronized的锁机制

文章目录一. 常见的锁策略1. 乐观锁和悲观锁2. 轻量级锁和重量级锁3. 自旋锁和挂起等待锁4. 普通互斥锁和读写锁5. 公平锁和非公平锁6. 可重入锁和不可重入锁二. synchronized的锁机制1. 锁升级/锁膨胀2. 锁消除3. 锁粗化一. 常见的锁策略 1. 乐观锁和悲观锁 乐观锁和悲观锁主…

C++ | 数据结构与算法 | 最小生成树算法讲解 | Kruskal Prim

文章目录前言Kruskal算法Prim算法前言 讲解之前&#xff0c;我们需要先明白连通图是指什么&#xff1f;连通图具有以一个顶点为起点可以到达该图中的任意一个顶点的特性&#xff0c;就算它们不直接相连&#xff0c;但是它们之间至少有一条可以递达的路径。并且连通图是针对无向…