题解-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(s)\) 和 \(d(t)\)?可以想象一条 \((t,s,F,\infty)\) 的原边,\(F\) 待定,要使答案最优。
如果原边 \((u,v,f,c)\) 变成 \((u,v,f-1,c)\),\(d(u)\) 减少 \(1\),\(d(v)\) 增加 \(1\);\((u,v,f,c)\) 变成 \((u,v,f+1,c)\) 亦然。
然后建立真正的源点 \(S\) 和汇点 \(T\)。
所以如果 \(d(u)>0\) 连 \((S,u,d(u),0)\),如果 \(d(u)<0\) 连 \((u,T,-d(u),0)\)。
这样可以转化为一个把 \(d(u)>0\) 的施舍给 \(d(u)<0\) 的问题。
这里先说一个明显的东西:\(c\) 是不需要减的。
对于原边 \((u,v,f)\),@如果 \(f\le c\),连 \((u,v,f,1)\)(\(f\) 减小)和 \((v,u,c-f,1)\)(\(f\) 增加),表示不影响容量改变流量的施舍。
再加上 \((v,u,\infty,2)\),因为当 \(f=c\) 以后可以一起增加 \(\infty\) 次。
@如果 \(c<f\),答案操作次数至少加 \(f-c\)。
先把 \(f\) 减成 \(c\),答案操作次数先加 \(f-c\)。
在 \(f-c\) 次限度内,\(f\) 增加的消耗可以用 \(c\) 当时少减少抵消。
所以连边 \((u,v,c,1)\)(\(f\) 减小) 和 \((v,u,f-c,0)\)(\(f\) 增加)。
同样要连 \((v,u,\infty,2)\),因为 \(c=f\) 以后可以一起增加 \(\infty\) 次。
最后回来定 \(F\):很明显 \(F\) 应该是非负整数,不如先当成 \(0\) 算出 \(d(s),d(t)\),然后连 \((t,s,\infty,0)\),表示这是条免费增加的边。
然后 当前答案操作次数 \(+\) 最大流最小费用 就是答案。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);~i;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
//Data
const int N=100;
int n,m,d[N];
//Flows
const int fN=N+2;
int fn,s,t;
vector<int> e[fN],to,fw,co;
void adde(int u,int v,int w,int c){
// cout<<u<<' '<<v<<' '<<w<<' '<<c<<'\n';
e[u].pb(sz(to)),to.pb(v),fw.pb(w),co.pb(+c);
e[v].pb(sz(to)),to.pb(u),fw.pb(0),co.pb(-c);
}
int dep[fN],pre[fN]; bool vis[fN]; queue<int> q;
bool spfa(){
R(u,fn) dep[u]=iinf,pre[u]=-1,vis[u]=false;
q.push(pre[s]=s),dep[s]=0,vis[s]=true;
while(sz(q)){
int u=q.front(); q.pop(),vis[u]=false;
for(int v:e[u])if(fw[v]&&dep[to[v]]>dep[u]+co[v])
dep[to[v]]=dep[u]+co[v],pre[to[v]]=v,
!vis[to[v]]&&(q.push(to[v]),vis[to[v]]=true);
}
return dep[t]^iinf;
}
pair<int,int> flow(){
pair<int,int> res(0,0);
while(spfa()){
int f=iinf;
for(int u=t;u^s;u=to[pre[u]^1]) f=min(f,fw[pre[u]]);
for(int u=t;u^s;u=to[pre[u]^1]) fw[pre[u]]-=f,fw[pre[u]^1]+=f;
res.x+=f,res.y+=dep[t]*f;
}
return res;
}
//Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m,fn=(t=(s=n)+1)+1;
int sm=0; adde(0,n-1,iinf,0);
R(i,m){
int u,v,w,c; cin>>u>>v>>c>>w,--u,--v;
if(w<=c) adde(u,v,w,1),adde(v,u,c-w,1);
else sm+=w-c,adde(u,v,c,1),adde(u,v,w-c,0);
d[u]+=w,d[v]-=w,adde(v,u,iinf,2);
}
R(u,n)if(d[u]>0) adde(s,u,d[u],0);
else adde(u,t,-d[u],0);
cout<<sm+flow().y<<'\n';
return 0;
}
祝大家学习愉快!
题解-CF708D Incorrect Flow的更多相关文章
- CF708D Incorrect Flow
CF708D Incorrect Flow 有源汇上下界最小费用可行流.(= =) 对每条给定的边连边: 首先\(f_i\)是给定的,所以要有一条这个边而且要流满,先\(a_i-b_i\)连一条上下界 ...
- 【CF708D】Incorrect Flow 最小费用可行流
[CF708D]Incorrect Flow 题意:给你一个点数为n,边数为m的流网络,每条边有一个容量c和流量f,这个网络可能是不合法的.你可以花费1的代价使c或f减少或增加1,可以修改无限次.你不 ...
- @codeforces - 708D@ Incorrect Flow
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个有源点与汇点的图 G,并对于每一条边 (u, v) 给定 ...
- 【luogu P2936 [USACO09JAN]全流Total Flow】 题解
题目链接:https://www.luogu.org/problemnew/show/P2936 菜 #include <queue> #include <cstdio> #i ...
- 题解报告:hdu 3549 Flow Problem(最大流入门)
Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, your t ...
- luoguP3128 [USACO15DEC]最大流Max Flow 题解(树上差分)
链接一下题目:luoguP3128 [USACO15DEC]最大流Max Flow(树上差分板子题) 如果没有学过树上差分,抠这里(其实很简单的,真的):树上差分总结 学了树上差分,这道题就极其显然了 ...
- Codeforces 269C Flawed Flow (看题解)
我好菜啊啊啊.. 循环以下操作 1.从队列中取出一个顶点, 把哪些没有用过的边全部用当前方向. 2.看有没有点的入度和 == 出度和, 如果有将当前的点加入队列. 现在有一个问题就是, 有没有可能队列 ...
- 题解——洛谷P3128 [USACO15DEC]最大流Max Flow
裸的树上差分 因为要求点权所以在点上差分即可 #include <cstdio> #include <algorithm> #include <cstring> u ...
- [LeetCode] Pacific Atlantic Water Flow 题解
题意 题目 思路 一开始想用双向广搜来做,找他们相碰的点,但是发现对其的理解还是不够完全,导致没写成功.不过,后来想清楚了,之前的错误可能在于从边界点进行BFS,其访问顺序应该是找到下一个比当前那个要 ...
随机推荐
- ip_rcv 中使用skb_share_check
/* * Main IP Receive routine. */ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct pack ...
- 记录一次读取hdfs文件时出现的问题java.net.ConnectException: Connection refused
公司的hadoop集群是之前的同事搭建的,我(小白一个)在spark shell中读取hdfs上的文件时,执行以下指令 >>> word=sc.textFile("hdfs ...
- 《HarmonyOS设备开发入门手册》
HarmonyOS设备开发入门手册-更新 [欢迎大家点击下载] 作者:连志安 想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://harmonyos.51cto. ...
- 如何测量Ceph OSD内存占用
前言 这个工具我第一次看到是在填坑群里面看到,是由研发-北京-蓝星同学分享的,看到比较有趣,就写一篇相关的记录下用法 火焰图里面也可以定位内存方面的问题,那个是通过一段时间的统计,以一个汇总的方式来查 ...
- Ceph编译加速的小技巧
总结了几个小技巧,用于在ceph编译过程中,能够更快一点 修改clone的地址 git clone https://github.com/ceph/ceph.git 可以修改成 git clone g ...
- [原题复现+审计][BJDCTF2020]Mark loves cat($$导致的变量覆盖问题)
简介 原题复现:https://gitee.com/xiaohua1998/BJDCTF2020_January 考察知识点:$$导致的变量覆盖问题 线上平台:https://buuoj.cn( ...
- springboot中aop的使用
Spring AOP(Aspect Oriented Programming),即面向切面编程,是OOP(Object Oriented Programming,面向对象编程)的补充和完善. OOP引 ...
- ccpc2020长春站F题 Strange Memory
dsu on tree 题目链接 点我跳转 题目大意 给定一棵包含 \(n\) 个节点的树,每个节点有个权值 \(a_i\) 求\(∑_{i=1}^n∑_{j=i+1}^n[a_i⊕a_j=a_{lc ...
- 关于ABBYY的常见问题与解答
问:ABBYY的版本那么多,我不知道哪款是我需要的.可不可以帮助我选择? 答:您可在此查看不同版本的功能介绍与版本对比,选择适合自己的版本即可. 查看ABBYY FineReader 15功能:查看A ...
- 教你调节Boom 3D的3D音效强度,让音乐更带感
Boom 3D的专业3D环绕技术,让用户能全身心地沉浸在立体音效中.无论是聆听音乐,还是观赏电影,立体音效都能为人们带来更加真实的听觉感触. 那么,Boom 3D的3D环绕功能到底能给用户带来怎样的体 ...