【2018.10.4】CXM笔记(图论)
。1.给你一个无向图,问这张图的最小割是否唯一。输出yes或no。
跑一边最大流,那么最小割的那些正向边一定满流(也就是过不了了)。所以在残余网络上,从S到T和从T到S各广搜找一组最小割的边(即正向边满流),判断是否完全相同即可。
2.题意同上,求所有最小割的边集并和边集交。
做完最大流后,整张图的最小割的边就只有反向边了,所以残余网络只存在从T到S的路径而不存在从S到T的路径。
于是把满流的边和不在T到S的路径上的边都删掉,然后对剩下的边(正、反向边)组成的图缩点。
为什么要缩点?比如下面这个强连通分量(这里是简单的环):

很明显它们的正向边都还没满流,所以都不是割边,直接缩掉这样的SCC。
缩点后整张图变成了一个DAG。由于已经删掉了不在T到S的路径上的点,DAG的所有边都是最小割的边,其边集就是最小割的并。
最小割的交的求法类似T1。
3.一张有向图,从起点出发,中途有一条边会断掉,但你只有走到那条边的一端时才知道。问最坏情况下从起点到终点的最短路(任何一条边都可能断)。当然,你是以最优策略走的。点、边数<=2500,图可能有环。
首先,不可能不断边。
其次,如果有桥,那这个桥断了就是最坏情况,无解。
dp[i][j]表示从起点走到i,最坏情况下是编号为j的边断了,最短路是多少。
4.一张无向图,每种边权的边不会超过5个,求有多少种最小生成树。点、边数<=100000。
5.n个点,任意连边,问有多少种方案能使原图成为无向连通图。(poj1737 / bzoj3456)
(1) n<=8
(2) n<=12
(3) n<=100
(4) n<=2000
(5) n<=100000
6.n(<=2000)个节点的树,可以添加至多k(<=50)条边权为$W$的边,求在经过每条边的情况下从根节点出发回到根节点的最短路(加上的边也要经过)。
像这种图论题一般都要先推一些结论。
那这道题有什么结论呢?
我们可以先想想不加边的时候总路径是多少。当然,每条边都有去有回走了两次,因此此时最短路(当然只有一种路径)就是 所有边权之和*2。如图。

添加一条边(绿边)之后,经过所有边的路径大概就变成这样

那到底少走了哪些路径呢?没错,如图的黄线部分可以只走一次。

也就是说,黄线覆盖的边都是“有去无回”的。
当然不可能有无去无回的边,因为每条边至少经过一次(重要结论)
而黄线是哪一段?就是新连接的两点之间的原路径。也可以认为是两点到LCA的路径并。
让我们举出一个例图:

所以,每条边可以分走一次和走两次两种情况。我们可以考虑一条边的状况:
如果一条边经过两次(钦定这条蓝边),

那它一定有偶数条儿子边有去无回(0也是偶数)。
为什么呢?
因为这条边要有去有回,那么 以这条边下端的点为根的子树 与其它子树(即除了这棵子树以外,原树的剩余部分)有偶数条加边。
如果连出去奇数条边的话,由于每条加边也都要走,所以最终一定会转出这棵子树而回不来了。如果出去后重走新边回来,那么可以证明出这棵子树的部分都是白走。因为要原路返回这条边,到其它子树走的那些边必定都是有来无回的,且最终多走了加边两次。可以证明这样不比不连奇数条边更优。
但是连出去偶数条边好像依然很复杂啊!这时每条边走的次数如下图。

我们发现,有两棵不同的子树的边都只走了一次,但是我们应该让一个点(比如上图的黄点)的dp限定在以这个点为根的子树中,而不影响其它子树,这样才能逐层向父亲合并答案。
好像dp不可做了,回去读题。
但再读题,我们注意到“所有加边的边权相等”,那这有一个什么性质呢?
...交叉边的情况好像可以忽略。
为什么可以这么想?
大家如果学过小学知识就能构思出这样一个交叉图(加边还是绿色):

它也可以这么连边到终点:

由于加边权值相等,且总是只经过一条黑边,所以两次路径长度相等。
换回这道题是个什么玩意:

我们发现两棵子树的边都只走了一次,那我们为什么要让它们交叉加边呢?这种情况等价于它们各自加边:

这样就可以只考虑以某个点为根的子树的情况了。
好了,我们解决了 以这条边下端的点为根的子树 向其它子树连出偶数条加边 这个棘手的问题,证明了连出去偶数条加边的情况等价于不连出去加边的情况。
所以,在我们的dp情况中,一条边(仍然是下图蓝边)要有去有回,那么 以这条边下端的点为根的子树 是独立的(即与其它子树没有加边)。
(回到原图)
前面说过,当一条边有去有回时,这条边有偶数条儿子边有去无回。
类似地,如果一条边只经过一次(有去无回),这条边有奇数条儿子边有去无回,这棵子树向其它子树连了奇数条加边。
根据前面对于前面那种情况下,加边数为偶数但只能是0 的证明,这里每2条与其它子树连的加边都可以消为在各自子树中连边,因此这棵子树与其它子树一定只连了1条加边。
然后可以推出,唯一的连向其它子树的加边 就在这条边(仍然是下图蓝边)的 一条有去无回的儿子边下的子树,这样就不用回到这条边了。

我们可以套用经典的树上背包转移:设 $dp(i,j,0/1)$ 表示在以点$i$为根的子树,该子树中加了$j$条边(也就是说加边的两端点都在该子树中才算!连到其它子树的不算),点$i$的父节点是否经过一次(经过两次记为0,经过一次记为1)。
再设$v$为当前扫到的$i$的一个儿子点,$w$为对应的儿子边,$k$为给以这个儿子为根的子树 分配的加边数,那就有四种转移。

tips:$dp(i,j,0)$(根节点的父边有去有回)的转移中,$dp(v,k,1)+w+dp(i,j-k-1,1)+W$ 中 $j-k-1$ 一项的 $-1$ 意思是这个儿子是有去无回的,但要回到根节点,以这个儿子为根的子树 就要向整棵子树中已经转移过的部分连一条边,所以转移时独立出这条长度为$W$的加边。

最短路就是$\min[dp(root,x,0),dp(root,x,1)]$ | $0\leq x\leq k$。
时间复杂度$O(nk)$。
代码?不存在的,这只是个笔记
【2018.10.4】CXM笔记(图论)的更多相关文章
- 【2018.10.20】CXM笔记(思维)
1. 给你个环状字符串,问从哪个地方拆开能使它的字典序最小. 先预处理任意子串的哈希值. 然后枚举拆点,将它与当前最优的拆点比较谁更优(就是从哪拆的字典序更小),具体方法是二分+哈希找出两串最长的相同 ...
- 2018.10.26 浪在ACM 集训队第四次测试赛
2018.10.26 浪在ACM 集训队第四次测试赛 题目一览表 来源 考察知识点 完成时间 A 生活大爆炸版 石头剪刀布 NOIP 提高组 2014 模拟??? 2018.11.9 B 联合 ...
- SLES 10安装Oracle10gR2笔记
SLES 10安装Oracle10gR2笔记 一. 数据库安装 . 安装C/C++ Compiler gcc --version验证是否安装 . 验证Service Pack版本 SPident –v ...
- 怎么把Thu Nov 22 2018 10:49:36 GMT+0800转换成正常日期
this.data //Thu Nov 22 2018 10:49:36 GMT+0800 this.date_of_birth = date.getFullYear() + '-' + (date. ...
- python中使用Opencv进行车牌号检测——2018.10.24
初学Python.Opencv,想用它做个实例解决车牌号检测. 车牌号检测需要分为四个部分:1.车辆图像获取.2.车牌定位.3.车牌字符分割和4.车牌字符识别 在百度查到了车牌识别部分车牌定位和车牌字 ...
- OSC Source Code Innovation Salon(2018.10.20)
时间:2018.10.20地点:北京 朝阳 浦项中心B座2层
- IDC Digital Transition Annual Festival(2018.10.19)
时间:2018.10.19地点:北京万达文化酒店
- Dell Technology Summit(2018.10.17)
时间:2018.10.17地点:北京国家会议中心
- Trusted Block Chain Summit(2018.10.09)
时间:2018.10.09地点:北京金隅喜来登大酒店
- 2018.10.2浪在ACM 集训队第三次测试赛
2018.10.26 浪在ACM 集训队第三次测试赛 今天是暴力场吗???????可怕 题目一览表 来源 考察知识点 完成时间 A 1275 珠心算测试 NOIP 普及组 2014 暴力??? 201 ...
随机推荐
- [习题]输入自己的生日(年/月/日)#2 -- 日历(Calendar)控件的时光跳跃,一次跳回五年、十年前?--TodaysDate属性、VisibleDate属性
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/06/10/calendar_visibledate_birthday_dropdow ...
- DatePicker 注意点 1.不用v-model 用:value 2.配合on-change进行回调 3.初始值 当天的用 (new Date()).toLocaleDateString().replace(/\//g, '-')
<DatePicker :value="formData.date" type="date" format="yyyy-MM-dd" ...
- chrom控制台常用方法
console.assert对输入的表达式进行断言,只有表达式为false时,才输出相应的信息到控制台 . console.count(这个方法非常实用哦)当你想统计代码被执行的次数 console. ...
- PAT 乙级 1037
题目 题目地址:PAT 乙级 1037 题解 本题有两个版本的代码,初版因为种种问题写得比较繁琐,具体的分析见后文,更新的之后的版本相对来说要好很多,代码也比较清晰简洁. 初版的代码主要有如下几方面的 ...
- redis集群理解
Redis在3.0中也引入了集群的概念,用于解决一些大数据量和高可用的问题,但是,为了达到高性能的目的,集群不是强一致性的,使用的是异步复制,在数据到主节点后,主节点返回成功,数据被异步地复制给从节点 ...
- react 列表渲染
https://reactjs.org/docs/lists-and-keys.html#keys 以下代码运行会报错:Warning: Each child in an array or itera ...
- perl学习之I/O基础
1.从标准输入进行输入<STDIN> 2.从钻石操作符进行输入<> 3.参数调用@ARGV 4.向标准输出进行输出 5.用printf进行格式化输出 1.<STDIN&g ...
- Python基础:字典(dict)与集合(set)
查找场景下与列表的性能对比 字典与集合之所以高效的原因是:内部结构都是一张哈希表. 平均情况下插入.查找和删除的时间复杂度为 O(1). 假设有数量100,000的产品列表: import time ...
- leetcode刷题——查找
知识点 备忘-必备算法 题目 顺序查找 二分查找 树表搜索 广度优先搜索算法(BFS) 深度优先搜索算法(DFS) 回溯(Backtracking) 题解 CS-Notes Algorithm_Int ...
- Oracle排错总结
一.Oracle常规恢复之不安全恢复 http://www.cnblogs.com/jyzhao/p/4723994.html#2.11