【例1】【hdu5889】 - 算法结合(BFS+Dinic)

题意

\(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路径来进攻我方,为了阻止敌人,我们要把一些路封死,每条路径封死需要一些花费,求最小花费。

分析

这种题好像好常考呢。

有时候不是BFS,而是SPFA,不过都是差不多的,就是一个逐步满足的思想。

我们首先进行BFS,求出最短路径图。

然后对最短路径图求最小割即可。

【例2】【hdu4289】 - 最少割点

题意

给出一个有\(n\)个点,\(m\)条边组成的无向图。给出两个点\(s\),\(t\)。

对于图中的每个点,去掉这个点都需要一定的花费。

求至少多少花费才能使得s和t之间不连通。

分析

现在相当于问:割掉多少个点,能使得S,T不连通。

而割掉多少条边,使S,T不连通是我们会的:直接求最小割。

所以把点变成边即可,做法:把一个点拆成两个,中间用一条容量为1的边连接。

【例3】【hdu3987】 - 割边最少的最小割

题意

求割边最少的最小割。

输出最小割值,以及割边的条数。

分析1 - 扩倍离散化

设边数为\(m\),每条边的容量为\(c\),则把\(c\)变为\(c*(m+1)+1\)

设新图求出来的最小割为\(x\),则原图的最小割为\(\lfloor{x\over m+1}\rfloor\),最小割边数为\({x\mod (m+1)}\)

证明:设原图的一个割集为\(S\),原图的割的值为\(f(S)\),则新图的割的值为\(\sum c*(m+1)+1=(m+1)f(S)+|S|\),因为\(0\leq |S|<(m+1)\),所以新图的割值可以对应出原图的割值和边数。

分析2 - 逐步满足

建图,得到最大流后,图中边若满流,说明该边是最小割上的边;

再建图,原则:满流的边改为容量为 1 的边,未满流的边改为容量 INF 的边,然后最大流即答案。

小结

(1)最值上的最值:

①扩倍离散化:在不影响元素的时候,把元素附加特性,再转化回去

②逐步满足:先满足第一步的最值,再满足第二步的最值

【例4】【hdu3657】 - 棋盘染色+建模

题意

\(n*m\)的矩阵,每个位置都有一个正数,一开始你的分数是\(0\),当你取走一个数字时,你的分数增加那个分数。如果你取完数字后,新出现了\(2\)个相邻的都是空的格子,那么你的分数减少\(2 * ( x\)&\(y)\),\(x\),\(y\)是那两个格子的原始数值。

分析

首先,这种相邻格子的问题都会想到它是一个二分图:

横纵坐标为偶数的在左边,横纵坐标为奇数的在右边。

构图如下:

一个超级原点,和左边的点相连接,容量是其权值。

一个超级汇点,右边的点和其连接,容量是其权值。

如果左边的点x和右边的点y相邻,连接x,y容量为2 * (x & y)

用 总权值 - 最小割值。

小结

(1)对于这种棋盘上相邻格子的二分图的问题,通常要进行黑白染色。

【例5】【hdu3251】 - 拆点

题意

一个国家的地图是一张\(n\)个点\(m\)条边的有向图。

你保卫了国家成为了英雄,现在国王答应给你一些城市。

国王居住在首都,编号为\(1\),但他不想随意的到达你的领地,所以你必须破坏一些路,使得从首都到你所拥有的所有城市不连通。

而破坏这些路需要花钱。国王给了你\(f\)个城市供你选择,每个城市有一个价值。

你最后的总收益=你选择的城市的价值之和-破坏路花费的钱。

现在让你输出最大的收益,以及完成这样的收益应该破坏哪些路。

分析

很巧妙的一道题。

把每个供选择的城市给拆成两个点,容量为城市价值。

然后跑最小割。

小结

(1)如果涉及到点权的问题,通常有两种处理手段:

①拆点,边权为点权

②点连向源或者汇,容量为点权

【例6】【bzoj2756】 - 棋盘游戏 - 二分答案+Dinic

题意

Blinker最近喜欢上一个奇怪的游戏。

这个游戏在一个 \(N*M\) 的棋盘上玩,每个格子有一个数。每次 Blinker 会选择两个相邻

的格子,并使这两个数都加上 \(1\)。

现在 Blinker 想知道最少多少次能使棋盘上的数都变成同一个数,如果永远不能变成同

一个数则输出\(-1\)。

分析

二分变成的数的大小,就可以求出一个数要被变几次。

而每次是相邻两个边,所以黑白染色,相邻连边。

源点连黑点,容量为需要变的次数;白点连汇点,容量为需要变的次数。

跑最大流判是否满流。

小结

(1)有一种棋盘游戏,满足这样的特性:①给某些满足特定关系的位置增值 ②有目标棋局 ③求变化的最小步数

这类问题通常有两种解决方案:①棋盘染色 ②设未知数,用高斯消元、线性规划等方法

【例7】【bzoj3931】 - 算法结合(SPFA+Dinic)

题意

求最小路径树上的最小割。

分析

逐步满足。

先求SPFA,搞出最小路径树。

再用最小割。

最大流&最小割 - 专题练习的更多相关文章

  1. 最大流-最小割 MAXFLOW-MINCUT ISAP

    简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...

  2. UVa11248 Frequency Hopping(最大流+最小割)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33206 [思路] 最大流最小割. 可以确定的是如果不可行需要修改的 ...

  3. matlab练习程序(最大流/最小割)

    学习这个算法是为学习图像处理中的图割算法做准备的. 基本概念: 1.最大流是一个有向图. 2.一个流是最大流,当且仅当它的残余网络中不包括增广路径. 3.最小割就是网络中所有割中值最小的那个割,最小割 ...

  4. 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割

    Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...

  5. HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...

  6. ISAP 最大流 最小割 模板

    虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> # ...

  7. Codeforces 965 枚举轮数贪心分糖果 青蛙跳石头最大流=最小割思想 trie启发式合并

    A /*#include<cstring>#include<algorithm>#include<queue>#include<vector>#incl ...

  8. 网络流 最大流—最小割 之SAP算法 详解

    首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...

  9. nyoj-677-最大流最小割

    677-碟战 内存限制:64MB 时间限制:2000ms 特判: No通过数:2 提交数:2 难度:4 题目描述: 知己知彼,百战不殆!在战争中如果被敌人掌握了自己的机密,失败是必然的.K国在一场战争 ...

随机推荐

  1. Drupal 7.31版本爆严重SQL注入漏洞

    今早有国外安全研究人员在Twitter上曝出了Drupal 7.31版本的最新SQL注入漏洞,并给出了利用测试的EXP代码. 在本地搭建Drupal7.31的环境,经过测试,发现该利用代码可成功执行并 ...

  2. BNU 4188 Superprime Rib【BFS】

    题意:给出n,输出n位超级质数,超级质数的定义为“依次去掉右边一位后仍然为质数的数” 因为一个n位质数去掉右边一位数之后仍然为质数,说明它是由n-1位超级质数演变而来的, 同理,n-1位超级质数也由n ...

  3. UVa 10129 Play On Words【欧拉道路 并查集 】

    题意:给出n个单词,问这n个单词能否首尾接龙,即能否构成欧拉道路 按照紫书上的思路:用并查集来做,取每一个单词的第一个字母,和最后一个字母进行并查集的操作 但这道题目是欧拉道路(下面摘自http:// ...

  4. 自学了三天的SeaJs学习,解决了前端的一些问题,与小伙伴们一起分享一下!

    我为什么学习SeaJs? [第一]:为了解决项目中资源文件版本号的问题,以及打包压缩合并等问题. [第二]:好奇心和求知欲.[我发现很多知名网站也都在使用(qq空间, msn, 淘宝等等),而且 Se ...

  5. [反汇编练习] 160个CrackMe之003

    [反汇编练习] 160个CrackMe之003. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  6. AI 状态机

    by AKara 2010-11-11 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras 一个简单横版游戏 ...

  7. LeetCode Linked List Cycle 单链表环

    题意:给一个单链表,判断其是否出现环! 思路:搞两个指针,每次,一个走两步,另一个走一步.若有环,他们会相遇,若无环,走两步的指针必定会先遇到NULL. /** * Definition for si ...

  8. 使php支持mbstring库

    多国语言并存就意味着多字节,PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数.对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF ...

  9. HashMap的两种遍历方式

    HashMap的两种遍历方式 HashMap存储的是键值对:key-value . java将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了Hash ...

  10. 怎样在 Ubuntu 中修改默认程序

    导读 作为一个新手,你需要知道如何在 Ubuntu 中修改任何默认程序,这也是我今天在这篇指南中所要讲的. 对于我来说,安装 VLC 多媒体播放器是安装完 Ubuntu 16.04 该做的事中最先做的 ...