题解-CF708D Incorrect Flow】的更多相关文章

题面 CF708D Incorrect Flow 给一张网络流图,可能有流量不守恒或者流量超过容量的情况,求最少的将某条边流量或容量 \(\pm 1\) 的操作次数使得网络流图正确. 数据范围:\(1\le n,m\le 100\),\(0\le f,c\le 10^6\). 题解 是一篇由思考题目时的笔记修改成的题解,希望不同的思考轨迹可以帮助仍然有能力学习 OI 的您. 设 \(d(u)\) 为当前 \(u\) 节点 出流 \(-\) 入流,要让所有 \(d(u)=0\). 如何解决 \(d…
CF708D Incorrect Flow 有源汇上下界最小费用可行流.(= =) 对每条给定的边连边: 首先\(f_i\)是给定的,所以要有一条这个边而且要流满,先\(a_i-b_i\)连一条上下界为\([f_i,f_i]\)的边 如果\(f_i\leq c_i\),可以增加流量或者减少流量,如果减少只要减流量就可以了,如果增加,在\([f_i,c_i]\)这一段只要加流量,大于\(c_i\)就要流量和容量都加,整合一下,减少就是连反向边,\((b_i,a_i,f_i,1)\):增加有两段,费…
[CF708D]Incorrect Flow 题意:给你一个点数为n,边数为m的流网络,每条边有一个容量c和流量f,这个网络可能是不合法的.你可以花费1的代价使c或f减少或增加1,可以修改无限次.你不需要使流量最大,你只需要花费最少的代价把原图改造成一个合法的网络. $n,m\le 100,c,f\le 10^6$ 题解:我们用有上下界的费用流来解决这个问题. 对于一条边a->b,如果c>f,则我们从a到b连一条下界和上界都是f,费用为0的边:因为可以减少流量,所以连一条从b到a,容量为f,费…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个有源点与汇点的图 G,并对于每一条边 (u, v) 给定 f(u, v) 与 c(u, v).f 表示流量,c 表示容量.G 不一定是合法的网络流. 求一个新图 G',使得 G' 是一个合法网络流(流量守恒与容量限制) ,且 ∑(|f'(u, v) - f(u, v)| + |c'(u, v) - c(u, v)|) 最小. 输出这个最小值. input…
题目链接:https://www.luogu.org/problemnew/show/P2936 菜 #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 10000; const int inf = 1e9; int n, m, s,…
Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, your task is to find out the maximum flow for the weighted directed graph. Input The first line of input contains an integer T, denoting the number of test…
链接一下题目:luoguP3128 [USACO15DEC]最大流Max Flow(树上差分板子题) 如果没有学过树上差分,抠这里(其实很简单的,真的):树上差分总结 学了树上差分,这道题就极其显然了,不就是把每一条运输路线差分进去,那就是板子了啊. 树上差分还是很有用的,比较容易写,这种询问很少的题目去敲那么长(还容易出玄学错误)的树剖很浪费,用树上差分就很快了!(//...微笑...\\) 上一波代码: #include<iostream> #include<cstdlib>…
我好菜啊啊啊.. 循环以下操作 1.从队列中取出一个顶点, 把哪些没有用过的边全部用当前方向. 2.看有没有点的入度和 == 出度和, 如果有将当前的点加入队列. 现在有一个问题就是, 有没有可能队列中为空还没有更新完毕, 这是不可能的, 我们能这么考虑, 其中一个点x的入度还没有满, 那么我们能推出(u, x)还没有被确认, 说明u还没入队, 因为原图为有向图, 所以最后一定会推到1, 这回产生矛盾, 所以这种情况不可能发生. #include<bits/stdc++.h> #define…
裸的树上差分 因为要求点权所以在点上差分即可 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; ; ; ; ,u[MAXN*],v[MAXN*],first[MAXN],next[MAXN*]; int cf[MAXN]; ]; int n,k; void addedge(int ux,int vx){ cnt++; u[cnt]=ux; v[cnt]=vx; n…
题意 题目 思路 一开始想用双向广搜来做,找他们相碰的点,但是发现对其的理解还是不够完全,导致没写成功.不过,后来想清楚了,之前的错误可能在于从边界点进行BFS,其访问顺序应该是找到下一个比当前那个要大的点,但是我写反了..可以先对左边的队列进行BFS,保存其visited,再接着对右边的队列进行BFS,当访问到之前已经访问过的结点时,则加入到结果中. 实现 // // #include "../PreLoad.h" /* Given the following 5x5 matrix:…