寒假day4 2.6
讲师:张尊喆,NOI2021Au,rk49,卡线Au,from 石家庄第二中学。拜谢叉院!
qq:1607432325
mail:1607432325@qq.com
图论
存图
-
链表(网络流)
-
vector
从一点出发的最后一条边向前跳。
并查集
两种操作——查询、合并两个集合。
对于每个集合设置一个代表元素。
启发式合并+路径压缩 \(O(αn)\)。
启发式合并
这里给出复杂度证明。
先不给了。
带权并查集
感性理解,维护集合关系时维护边权。
种类并查集
食物链
相比普通并查集,多了一个天敌的关系。
对于 \(x\),建三个点,表示分属三类。
一种比较新颖的思路。
面对操作进行异域连边。
不如好好研究一下带权并查集做法。
但这种思考方式比较有趣。
CEOI1999 Parity Game
套路题,变成前缀中 \(1\) 的奇偶性,令 \(s_x\) 代表前缀中 \(1\) 的个数。
本质上就是 \(s_y-s_x\) 的奇偶性。
等于奇数,则代表奇偶性不同;否则相同。
利用上一题的思想做种类并查集。
不如好好研究一下带权并查集做法。
如果奇偶性相同,就连一条边权为 \(0\) 的边,否则 \(1\)。
总之具有传递性,可以路径压缩。
路径压缩可以维护\(\% 2\) 意义下的加法,相当于做异或。
白雪皑皑
序列并查集
考虑倒着操作,这样不会出现下一次会覆盖前一次这种操作,经典时光倒流类题目。
只需要考虑每个点第一次被染色的情况。
如何快速找到没有被染色过的点?
用并查集维护下一个没被染色的点。
易维护。
染色时每次 find(l)
易染色。
经典套路。
时间复杂度 \(O(n)\)。
连续攻击游戏
发现只有两种属性,而图是有一种二元关系的。
对应属性连边,抽象地把边看做武器,显然,一条边对应一个点。
对于环/基环树,显然每个点都可以满足。
对于非基环树的无根树,显然根不能满足,所以选最大值当根,最后就是每个联通块不能满足的取最小值。
注意,重边也算环。
绝世好题。
最小生成树
性质:边权和最小,边权最大值最小。
非联通图只有生成森林。
Kruskal
贪心的连,并查集维护,不过多阐述。
证明
归纳法。
听不太懂。感性理解
但感觉调整法更容易证。
时间复杂度 \(O(m\log n)\)。
Prim
没什么用。
从节点开始,不断加点。
贪心的每次往里面加连接生成树集合与补集的边权最小的边。
可以用堆优化。
营救
借鉴最小生成树的思想。
最小生成树有一个优美的性质,在所有 \(s\sim t\) 的所有路径中,最小生成树上的那一条路径最大值最小。
做法显然。
CF1245 D
要学会把未知的问题变成已知的问题
新建一个超级源点,与所有点连边,边权为 \(c_i\),进行一遍 Kruskal 即可。
从意义上理解,可以把源点视作电力来源之类的东西。
从数学上理解,调整法可以证明。
P8074
考虑按照 \(x,y,z\) 排序,根据贪心思想只需对 \(x_{i-1},x_i\) 连边,其余两维也是如此。
随后进行一遍 Kruskal 。
根据调整法可以证明。
Kuglarz
没听懂,等晚上再看吧。
货车运输
经典题。
首先利用生成树的性质,建出一棵最大生成树。至于两点间路径最小值——显然路径是“起点——LCA——终点”,倍增乱搞即可通过。
严格次小生成树
结论:一定是拿非树边换最小生成树的某一条边。
枚举非树边,换最大值/次大值。
倍增求出最大值/次大值。
CF827D
-
对于非树边,应该求出路径上的最大值,尝试把最大值替代掉,显然,会出现在每一种最小生成树上,因为最大值都在原先最大值都在最小生成树上了。
-
对于树边,一定不能被非树边替代掉,应该小于非树边的最小值。
考虑怎么求最小值。利用从大到小区间的倍增。相当于把原来的操作反过来。
从大到小进行转移。向线段树一样下放 tag。
总之比较抽象。
最短路
floyd
本质是 dp。
spfa
P4667
01bfs
考虑对于一个格子中,原电线代价为 \(0\),翻转后的电线为 \(1\),进行 01bfs。
注意到可能对电线转两次,使得最短路中仍然是正确的。
但是我们发现,一个格子最多只有两个点可以到达(左上、右下/左下、右下)。
01bfs
一张图,边权为 \(0/1\),求最短路。
考虑 bfs 原理。
显然,队列中一定前面部分的最短路为 dis,后面部分为 \(dis+1\)。
发现通过边权为 \(0\) 的边,最短路仍为 dis,所以把结果扔到队头,进行扩展。
对于边权为 \(0\sim k,k/le 10\),求最短路。
可以开 \(k+1\) 个桶,每个桶存 \(dis+0,dis+1\ldots dis+k\) 的状态。
时间复杂度 \(O(n+m)\),空间复杂度 \(O(nk)\)。
P1462
触发关键词,二分。
对于 \(k\),显然,不应该考虑 \(>k\) 的城市,对剩下城市跑最短路后 check。
P1144
计数题
分三种情况讨论。
-
\(dis_y>dis_x+w\),\(f_y=f_x\)
-
\(dis_y<dis_x+w\),不用操作
-
\(dis_y=dis_x+w\),\(f_y+=f_x\)
P1119
考察对 floyd 的理解。
你连 floyd 都没理解好你做什么啊
P4822
经典分层图。
细节:对每层的 \(n\) 点的最短路取最小值。
负环
spfa又活了回来
从 spfa 的原理出发。
你连spfa都没理解好你做什么啊
USACO07DEC
面对除法,应该选择 01分数规划/斜率。
把环上的边权赋为 \(KE-F\),check 是否有负环。
骑士游戏
考虑 dp。
\(f_x\) 代表消除怪物 \(x\) 至少需要多少代价。
\(f_x=\min(K_x,\sumf_y+S_x)\)
后面没听。
P2371
同余最短路
显然听不懂。
时间复杂度 \(O(n\times a_1\times log n)\)
一塌糊涂。
差分约束
发现类似一个三角不等式的东西。
然后建一个奇奇怪怪的图,判断有无负环。
P4878
赛车游戏
显然不会
hu
\(1\le dis_y-dis_x\le 9\)
差分约束的妙用。
拓扑排序
感性理解含义。
只能对 DAG 拓扑排序。
Andrew and Taxi
显然二分答案。
神奇证明。
车站分级
看题解,建超级源点后拓扑排序+dp乱搞。
P3243
假。
倒着考虑。
建反图以后拓扑排序乱搞。
下午听课没有激情。
基环树
CF027F
借鉴 连续攻击游戏 的思路。
P1453
拆掉一条边后用树形dp求树的最大独立集。