题意:1到n节点(节点之间有一定的容量),需要流过C的流量,问是否可以?如果可以输出possible, 否则如果可以扩大任意一条边的容量 可以达到目的,那么输出possible option:接着输出每一条可以达到目的的边(按升序),再否则输出not possible 思路:先求一次最大流,如果流量至少为C,则直接输出possible,否则需要修改的弧一定在最小割里! 接着吧这些弧(最小割里的)的容量设为无穷大,然后在求最大流,看最大流的流量能否满足是C即可,如果满足了,那就把这一条边记录下来…
简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理解,对于每条反向边,我们流过它相当于撤销了一条正向边的流量. 并且它是必须的: 而且从理论上,我们在加入反向边之后得到的最大流,我们从残余网络考虑. 我们要认识到,反向边不会使最大流流量减少,这是很显然的.有flow<=flow'. 接下来我们考虑所有点的流量是否可以只用正向边得到. 并且我们考察汇…
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33206 [思路] 最大流最小割. 可以确定的是如果不可行需要修改的是流量已经达到上限的最小割中的边.可以考虑依次修改求最大流. 优化:1 在原最大流的基础上增广: 2 只增广到流量C为止. [代码] #include<cstdio> #include<cstring> #include<queue> #include<vector&…
[例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路径来进攻我方,为了阻止敌人,我们要把一些路封死,每条路径封死需要一些花费,求最小花费. 分析 这种题好像好常考呢. 有时候不是BFS,而是SPFA,不过都是差不多的,就是一个逐步满足的思想. 我们首先进行BFS,求出最短路径图. 然后对最短路径图求最小割即可. [例2][hdu4289] - 最少割…
学习这个算法是为学习图像处理中的图割算法做准备的. 基本概念: 1.最大流是一个有向图. 2.一个流是最大流,当且仅当它的残余网络中不包括增广路径. 3.最小割就是网络中所有割中值最小的那个割,最小割是不唯一的,不过最小割的值是唯一的. 4.最大流的流量等于某一最小割的容量. 算法思想就是Ford-Fulkerson方法. 具体流程: 1.首先使用广度优先搜索找到源节点到汇节点的一条路径,为增广路径. 2.如果找不到新的从源到汇的增广路径,则上一次求得的网络就是最大流,否则向下执行. 3.找出增…
Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方格棋盘,按照取数要求编程找出总和最大的数. Input 第 1 行有 2 个正整数 m 和 n,分别表示棋盘的行数和列数.接下来的 m 行,每行有 n 个正整数,表示棋盘方格中的数. Output 程序运行结束时,将取数的最大总和输出 Sample Input 3 3 1 2 3 3 2 3 2 3…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意: 给定一张有向图,可以阻碍若干条有向边,花费为边的权值,求使其最短路变得更长所需的最小花费. 解题思路: 1.因为最短路可能是多条,所以找出最短路网络,然后在最短路网络中跑最小割,即最大流.就切断了原先的最短路且保证了是最小花费(最小割). 2.值得注意的地方:边的长度限制为1e9,所以最短路数组…
虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> #include<iostream> #include<algorithm> #define ll long long using namespace std; #define REP( i , a , b ) for ( int i = a ; i < b ; ++ i ) #d…
题目大意:给一张网络,问是否存在一条恰为C的流.若不存在,那是否存在一条弧,使得改动这条弧的容量后能恰有为C的流? 题目分析:先找出最大流,如果最大流不比C小,那么一定存在一条恰为C的流.否则,找出最小割集,然后枚举每一条弧改动其容量,看是否存在恰为C的流. 代码如下: # include<iostream> # include<cstdio> # include<cmath> # include<string> # include<vector>…
A /*#include<cstring>#include<algorithm>#include<queue>#include<vector>#include<cstdio>#include<cmath>#include<iostream>*/ #include<bits/stdc++.h> using namespace std; typedef long long ll; ; int main() { in…