解题营_图论
图论
前言
这都是些啥题啊
越发感觉当时报错班了...
由于听不下去 所以把题目记了一下就跑路了
话说我先做水题没有问题吧...
8.18
完结了 留下了两个题木有做
完结撒花
芝士
- 并查集
- 最小生成树
- 最短路
- 拓扑
- 连通性
- 有向图
- 强连通
- 强连通分量
- 无向图
- 割点
- 桥
- 点双
- 边双
- 有向图
- 环
- 负环
- 差分约束
- 基环树
- 树的直径
- 二分图
- 二分图匹配
- 二分图覆盖
- 独立集
- 网络流
题目
联合权值
有贡献的点是与一个点的所有点 显然可以 \(O(n)\) 枚举中间点
若有两个点与该点相连 点权设为 \(a, b\) 则贡献为 \(2ab\) 若有三个点 则为 \(2ab + 2ac + 2bc\)
以此类推
逐一枚举每个相邻点进行组合复杂度过高 观察贡献 是完全平方式里面的一项 不妨写开
直接拿来用 复杂度就对了
寻觅道路
建反图 从终点跑 跑到的点都标上 然后枚举所有点 没有标记的点指向的所有点取消标记 在有标记的点上跑最短路
注意标记需要另存一边 不然直接改的话会影响后面的
无序字母对
字母相当于点
相邻即为边 无序即为无向边
找一条欧拉路径即为答案
然后发现自己没学过欧拉路径...
其实需要判联通的 但是这个题不用判也能过... 于是就懒的写了(从这里可以看出我连题都没看直接看的题解
关押罪犯
最大值最小 二分答案
并查集判联通
其实可以直接 贪 + 并查集
题目是以前做的了 但是懒得再写 所以就直接拿过来了
村庄
就是听完这个题之后才不想听的...
听了两遍都没听出这结论怎么弄出来的...
结论 若存在一点到直径两端的距离不小于 \(K\) 的点即不是二分图
--
代码木有写 想写的时候下课了 再上课之后就不想写了...
于是很开心遗憾的跑路了
排水系统
完全不想多说什么
略
时光的流逝
有向图上的博弈论
终点一定是先手必败态 能转移到先手必败的一定是先手必胜态 只能转移到先手必胜态的一定是先手必败态
正向直接做复杂度过高 建反图 按照上面拓扑排序即可
对于每一次询问显然可以推倒重构 再跑一边
这题做的时候有点懵逼 总感觉复杂度有点问题...
考虑了每次只改影响到的点 但是发现可能所有点都有影响...
越发感觉复杂度有问题 看了一眼数据范围
"拓扑的复杂度是啥来着 好像是线性的吧...大概? 那复杂度没有问题"
然后交了一发 喵的 暴力修改能过
然后去看题解发现题解就是暴力重构... 那没事了
Watering Hole G
最小生成树
兽径管理
"这...直接改的话复杂度好像是 \(O(w^2)\) 的吧..."
看一下数据范围 \(O(w^2)\) 的复杂度能过...
所以每加一条边跑一次最小生成树就好了
连着两道题的复杂度都好怪呀 我想多了???
封锁阳光大学
判断是否为二分图 直接进行黑白染色即可
注意图不一定联通
最优贸易
分层图最长路
许久之前做的时候是一遍过的...然后第二遍做(就是这次)交了好几遍
码力逐渐退步
足球
感觉像是一道 \(dp\) 的图论题 我根本想不到的拆点 爬去抄题解
不一定所有的人都有机会控球 比如第一个人直接带到最后也不是不可能
不一定一直有人控球 可能某个人将球踢到某个没有人的位置 让另一个人跑过去控也是有可能的 这种情况下一定是离球最近的人过去
真的感觉这个题目 \(dp\) 的思想浓郁
通过拆点来讨论球位于某个点时的状态
将一个点拆成五个 以 \((x, y, k), k \in \{0, 1, 2, 3, 4, 5\}\) 的三元组表示
\(0, 1, 2, 3\) 分别表示球位于当前点 且无人控球 正向 上 下 左 右 四个方向移动时的最小代价
\(4\) 表示球到达该点 且无人控球的最小代价
\(5\) 表示球到达该点 且有人控球的最小代价
相邻的点之间连边的感觉跟 \(dp\) 里面状态的转移差不多 具体见代码
Policija
只是简单读完题的我以为这题写个 tarjan 就能过
于是信心满满的写了 然后 \(WA\) 了样例... 或许纯粹是码力不行?
看了一会之后点开题解
看到清一色的圆方树 + 树剖懵逼了... 确实 圆方树也是 tarjan
先构建广义圆方树 再考虑两种操作
第二种操作相当于判断某个点是否在某一条路径上 树剖跳的时候维护一下即可
第一种操作 询问的是一条路径 可能使得两点不可达的路径一定是桥 所以先判断是否为桥 如果是桥的话 在构建圆方树的过程中会被转化为方点 同样是判断一个点是否位于某一路径上
\(map\) 不会用... 看了好久
Popular cows
强连通分量模板题
略
Układ scalony
???
重力球
不会跑路系列...
骑士游戏
又是一道不可能会做的图论题
\(spfa\) 还能这么玩...
对于某个点的取值 取决于其多个子节点的取值 也就是对于某个被更新的点 其所有的父节点(所有指向它的点)都有可能被更新
在 \(spfa\) 的过程中 对于每一个可能被更新的点 扫描其所有子节点 加上该点本身的物理攻击消耗 与该点当前值比较 尝试更新 对于能够更新的点 将所有指向该点的点入队 设为可能被更新的点
初始时所有点都设为魔法攻击的值 且所有点入队 也就是所有点都有可能被更新
Why Did the Cow Cross the Road III S
\(n\) 非常小 直接模拟建图 除了给出的道路以外其他的网格图的边直接全建上 然后从有牛的点跑 \(dfs\) 统计联通块中牛的数量 两两相乘即为答案
TOU-Tour de Byteotia
按照编号加边 并查集维护即可
核心城市
首先这些点一定是连在一起的 而且必然有一个点在直径上 且为直径的中心
把直径跑出来 找到中心 然后作为根统计每个点的高度 把前 \(K\) 大的删掉 取剩下的最大的即可
树形 \(dp\) 求直径好像不太好取中心的亚子 所以还是写 \(dfs\) 吧
小 \(K\) 的农场
差分约束
图的遍历
很容易想到建反图 从大到小的从每个点开始跑 能跑到的更新即可
Railway
看一眼 这不是 \(sb\) 差分? 然后开始写 喜提 \(36\) 分的好成绩
行 您强 于是跑去看题解
然后看到清一色的虚树人就傻了 sb 竟是我自己
其实不需要虚树的 朴素的树上差分就可以了
一开始考虑的是直接差分 对相邻的两个点之间的路径加 感觉大概每条边都会覆盖两边的亚子 于是就有了上面那个 \(36\) 分
整体的思路是没有问题的 但是直接对输出时候相邻的两个点路径加并不能保证所有的边都是正好加了两边 由于点是乱序的 可能会重复经过某一路径 就会出错
看了题解才知道 只需要按照 \(dfs\) 序进行排序 就可以保证涉及到的所有点之间的路径正好加了两遍 相应的 判断经过次数的时候调整为两倍的 \(K\) 即可
Knights of the Round Table
根本不会... 一开始以为是 2-set 然后发现不会统计个数
果然只有靠抄题解才能维持生活的亚子 然后题解的证明也没看懂
直接给结论了 证明看不懂...
若点双图中包含一个奇环 则所有点都至少在一个奇环上
建补图 tarjan 求点双 对每个点双二分图染色判断是否存在奇环 不在任何一个奇环上的点均无法参加会议
骑士
基环树上的最大独立集?
许久之前做的了 懒得再写一遍 代码就不粘了
网络最大流
略
追查坏牛奶Pollutant Control
所以网络流的题还是只会板子...
掺点东西就不会了...
首先把题目翻译成人话: 给定网络 求最小割及最小割的数量
题解中的很巧妙的思路 将边权假设原为 \(w\) 设为 \(w * (m + 1) + 1\) 然后再跑最大流
此时跑出的最大流 记为 \(ans\) 则 最小割为 \(\lfloor \frac {ans}{m + 1} \rfloor\) 最小割的数量为 \(ans \% (m + 1)\)
K-联赛
又是一道网络流 依旧不是很懂建完图之后跑出来的最大流的含义
判断某个队伍是否有希望夺冠 就将这个队伍所有可能获胜的比赛都判为胜 算出该队得分 再判断其他队伍的得分是否可以小于等于该队
对每个队伍分别考虑
设立 \(S\) 与 \(T\) 将所有的比赛视为节点 由 \(S\) 向所有的比赛连边 容量为可进行的比赛的场次 有比赛向参与该场比赛的两只队伍连边 容量为 \(INF\) 有每只队伍向 \(T\) 连边 容量为该队已胜场次与当前最高分的差
如果该网络的最大流等于未进行比赛的场次和 则当前球队可以成为冠军
为什么?
不知道... 如果有知道的可以解读一下此事网络最大流的含义 非常感谢
——END