图论做题记录
图论
一些图论建模和纯图论题。
首先是一些基础的 bfs,dfs,生成树。
常见的模型有最短路,分层图,欧拉回路,二分图,差分约束,同余最短路,图染色等,需要灵活转化。
P5100 [JOI 2017 Final] 足球
思路:大概方向是容易想到的,就是拆点跑最短路。
比较简单的方法是建 3 层点,第一层是人带球,第二层是球横向滚动,第三层是求纵向滚动,先求出每个点距最近的球员的距离,然后就好求最短路了。
[AGC032C] Three Circuits
题意:有一张 \(N\) 个点 \(M\) 条边的简单无向连通图,请你判断能否将边分成三个集合,每个集合都是一个可以多次经过重复点的环。
思路:没发现是欧拉回路,输麻了。
其实把边分成 3 个集合就相当于是要找 3 条欧拉回路。
于是原图首先得有欧拉回路,那么每个点的度数都是偶数。不过还有一些不合法的情况。
如果存在一个点的度数 \(\ge6\) 那么就一定有解 。
如果所有点的度数都是 2,那么就无解。
否则,如果有 \(\ge3\) 个点的度数为 4,那么一定有解;如果只有一个,就无解;否则就有两种情况:
发现第一种是无解的,条件就是 \(A\) 的邻居中有 \(\le2\) 个点可以不经过 A 到达 B,直接判即可。
CF1140F Extending Set of Points
题意:定义一个点集合 \(S=\{(x_i,y_i)\}(1\leq i\leq n)\) 的拓展操作为将符合以下条件的 \((x_0,y_0)\) 加入 \(S\):存在 \(a,b\),使得 \((a,b),(a,y_0),(x_0,b)\in S\)。不断执行以上操作直到不能操作,此时得到的集合即为拓展集合。现在给定 \(q\) 个操作,每次加入或删除一个点,重复点即为删除,你需要输出每个操作之后的拓展集合大小
思路:考虑对行列建二分图,那么最终的拓展集合应该是每个连通块是完全二分图,然后就好做了。
CF1442C Graph Transpositions
题意:给你一个 \(n\) 个顶点和 \(m\) 条边的有向图。顶点编号从 \(1\) 到 \(n\) 。顶点 \(1\) 处有一个标记。
你可以进行以下两种操作:
- 移动标记:如果存在一条 \(u\to v\) 的边,将标记从 \(u\) 移动到 \(v\),这个操作需要 \(1\) 秒。
- 图翻转:翻转图上的所有边的方向,将图上每一条边 \(u\to v\) 替换为 \(v\to u\),第 \(k\) 次使用这个操作需要耗时 \(2^{k-1}\) 秒。
你需要找到将标记从 \(1\) 移动到 \(n\) 的最短时间,请将答案对 \(998,244,353\) 取模。
思路:抽象题。
当时想到了 \(O(n^2\log n)\) 的分层图做法,分 \(dep\leqslant\log n\) 和 \(del>\log n\) 两种,前一种直接转移,后一种记录转移次数。
结果有一种做法就是先进行第一步,如果能到达就结束,否则就进行第二步,以翻转操作为第一关键字,移动作为第二关键字跑最短路,这样就结束了。
还有一种玄学做法,就是把大于 \(\log n\) 层之后每层间的转移代价设为一个极大值,然后跑最短路,最后答案除以极大值就是转移次数。非常高妙。
P5292 [HNOI2019] 校园旅行
题意:无向图,每个点有 0/1 的权值,多次询问两点间是否存在一条路径满足路径(不一定简单)上的点权连起来是回文串。
思路:想到了维护设 \(f(i,j)\) 表示 \((i,j)\) 是否合法,然后枚举边进行转移,复杂度 \(O(n^2+m^2)\)。
正解就是在这个基础上,考虑到每个回文串就是若干段 \(01,11,00\) 的组合,而且可以反复横跳来改变长度,但是无法改变就奇偶性,于是只用考虑每一段的奇偶性。
因为奇偶性恒定,于是我们想到了二分图。对于每一类边,我们判断每个连通块是否是二分图,如果是那么我们只用保留一棵生成树,否则在生成树上加个自环即可,这样我们就可以把边数降到 \(O(n)\) 的级别,总复杂度就是 \(O(n^2)\)。
P8276 [USACO22OPEN] Hoof and Brain P
题意:有一张有向图,有两个点上有石子,每次操作先手会选择一个石子,后手会选择一条出边移动石子,要求必须走到一个没有石子的点上,如果走不了就先手赢,否则如果可以一直进行就后手赢,每次询问给出两个石子的位置,求谁赢。
思路:好题。
自己只会类似过河卒一样的搜索。
正解:首先,如果初始有点在不在环上,那么 B 必胜,于是可以建反图跑拓扑排序,这样被遍历过的点就是 B 必胜的点。
再考虑剩下的点,我们对每个点染色,初始 \(col_x=x\),接着如果一个点的出边指向的点颜色全部相同,那么把这个点的颜色染成指向的点的颜色,这样颜色的含义就是这个点无论怎么移动都会经过 \(col_x\) 这个点,于是就有结论,如果两个点的颜色相同,那么 B 就可以让这两个点在 \(col_x\) 处重合,B 必胜,否则就 H 必胜。
考虑怎么求出每个点的 col,可以用 map 维护每个点出边指向的点的颜色种数,每次启发式合并两个颜色集合的点即可。
CF1149D Abandoning Roads
题意:一张 \(n\) 个点 \(m\) 条边的无向图,只有 \(a,b\) 两种边权(\(a<b\)),对于每个 \(i\),求图中所有的最小生成树中,从 \(1\) 到 \(i\) 距离的最小值。
思路:好题。
主要是利用了最小生成树的性质:任意两点间路径最大值一定是最小的。
这就意味着如果两点间有一条由 a 边连接的路径,那么条路径一定在最小生成树上。
同样有:如果我们把所有 a 边连接的连通块缩起来,那么任意一条可能在最小生成树上的路径一定不会重复经过一个连通块,因为这样会有两个存在 a 边路径的点由 b 边连接。
于是我们可以 \(O(2^n)\) 枚举经过了的连通块集合来算最短路,相当于把每个点拆成 \(O(2^n)\) 个点然后跑最短路,因为边权只有两种,可以用两个队列维护,做到 \(O(2^nm)\)。
我们发现有些状态是可以不要的。我们记录经过的连通块是防止离开再进入一个连通块,而如果存在大小不超过 3 的连通块,我们即使不记录是否经过也不会得到一个离开再进入这个连通块的路径,于是可以不记录这些连通块,那么剩下的连通块至多只有 \(O(2^{\frac{n}{4}})\) 个,于是复杂度是 \(O(2^{\frac{n}{4}}m)\)。
CF1458D Flip and Reverse
题意:有一个 01 序列,每次可以翻转并反转一个 01 个数相同的区间,求操作后字典序最小的序列。
思路:好神仙的题目。
考场上发现操作等价于翻转前缀和序列,然后就没继续想了。
正解就是在此基础上,发现在前缀和之间连边后,任意一条欧拉回路都对应着一个最终的字符序列。
可以感性理解。
于是就变成了求字典序最小的欧拉序,可以简单解决。
CF1583H Omkar and Tours
题意:给定一棵有 \(n\) 个节点的树,每个点有点权 \(e_i\),每条边有重量限制 \(c_i\) 以及费用 \(t_i\)。两点间的费用定义为两点间简单路径上 \(t_i\) 的最大值。特别地,若起点与终点相同,则费用为 \(0\)。
现在给出 \(q\) 个询问,每次给出 \(v,x\),查询从 \(x\) 节点出发,只经过 \(c_i \geq v\) 的边,能到达的最大点权是多少?前往这些点权最大节点之一,可能的最大费用是多少?
题意:好厉害的题目。
首先,自然得想到可以按 \(c_i\) 从大到小加边,然后维护并查集,这样可以轻松解决第一问。
假设所有点权都不相同,那么我们可以直接求答案,否则 \(\cdots\) 就不会了。
正解是一个很神仙的想法。考虑我们记录一个点权最大的点,同时记录它到其他点权最大点的答案,这样每个点的答案一定是它到我们记录的点的路径上和我们记录的点到其他点权最大点的答案中较大的一个(证明可以考虑反证),于是就很简单了。
P9189 [USACO23OPEN] Custodial Cleanup G
题意:一个 \(N\) 个节点 \(M\) 条边的无向简单图,其中每个房间有一个颜色 \(C_i\),以及一个钥匙,颜色为 \(S_i\), FJ 最初在 \(1\) 号节点,手上一把钥匙都没有。
可以进行无数次以下操作:
-
捡起当前房间的钥匙。(FJ 可以同时手持多个钥匙)
-
将部分或全部手上的钥匙放在当前房间。 (房间内可以同时放多把钥匙)
-
通过一条边,移到一个相邻的房间,前提是目标房间是房间 \(1\), 或者 FJ 拥有至少一个目标房间颜色的钥匙。
已知 \(F\) 是 \(S\) 的排列, FJ 想要让每个房间里面都恰好有一个 \(F_i\) 颜色的钥匙,求是否可能。
思路:首先,一边捡钥匙一边放钥匙一定不优,于是考虑分成两部分,能否拿到所有钥匙和能否把所有钥匙放回。
对于第一步,可以直接广搜,如果可以走,那么就直接走,否则就存入对应颜色的集合里,如果某一次拿了这个颜色就把这个集合里的点加入队列。
对于第二步,和上一步差不多,不过如果没有这个点颜色的钥匙但是这个点的颜色和终状态相同那么也可以走。
[ARC092F] Two Faced Edges
题意:对于无向图的每一条边,判断将这条边反向后强联通分量数量是否改变。
思路:考虑充要条件。
- 原图中存在 \(v\rightarrow u\) 的路径
- 原图中存在 \(u\rightarrow v\) 的路径且不含上面的边
如果只满足一条,那么就会变化。
证明:
- 如果都不满足,这两个点不会产生强联通分量,不用考虑。
- 如果都满足,那么是否反向都会使强联通分量,不用考虑。
- 这时可以说明,如果没有 \(u\rightarrow v\) 的边,那么 \(u,v\) 一定不在一个强联通分量中;如果有,那么就可以在同一个强联通分量中。因此会改变。
第一个条件可以 \(O(nm)\) 直接搜。
第二个条件相当于是判断 \(u\rightarrow v\) 是否是必经边,可以先求出 DFS 时遍历到 \(x\) 时边的编号,然后把所有出边顺序翻转,再求一遍,如果相同就说明是必经边,否则就不是。
CF875F Royal Questions
题意:有 \(n\) 个王子和 \(m\) 个公主。每个公主有两个喜欢的王子,编号分别为 \(a_i\),\(b_i\),但一个王子只能娶一个公主(一个公主也只能嫁给一个王子)。每个公主有嫁妆价值为 \(w_i\),求国王能够得到的嫁妆的最大值。
思路:考虑建边,边 \((u,v)\) 表示 \(u\) 把公主让给了 \(v\),那么一个点的入度最多为 1,即形成了一个外向基环树森林。于是按 \(w_i\) 从大到小加边,用并查集维护连通性,并记录当前连通块是树还是基环树,如果两个点已经联通,那么如果原来是树,就可以选并变成基环树,否则只要不是两棵基环树就可以选择,如果两棵树合并就还是树,否则是基环树。
CF79D Password
题意:你有 \(n\) 个灯泡,一开始都未点亮。
同时你有 \(l\) 个长度,分别为 \(a_1 \sim a_l\)。
每次你可以选择一段连续的子序列,且长度为某个 \(a_i\),并将这些灯泡的明灭状态取反。
求最少的操作次数,使得最后有且仅有 \(k\) 个位置是亮的,这些位置已经给定,为 \(x_1 \sim x_k\)。
思路:考虑转成差分序列,那么每次就会操作两个位置,因为 \(k\) 很小,于是可以考虑用状压,这样需要知道的就是把 \(x,y\) 位置同时取反的最小代价,这个可以预先对每个关键位置开始跑一遍最短路来求出,于是就做完了。
P2474 [SCOI2008] 天平
题意:有一些砝码,重量为 1,2,3,给定一些砝码的大小关系,现在把 A,B 放在砝码一边,求有多少种选择两个砝码的方法使得天平左边重、一样重、右边重。
思路:看上去就很差分约束。
设 \(maxn[i][j],minn[i][j]\) 表示 \(i,j\) 的差值的最大最小值,根据一开始是大于还是小于还是不确定,可以确定初值。
然后就是差分约束。因为数据范围小,可以直接 Floyd,即 \(maxn[i][j]=\min(maxn[i][k]+maxn[k][j]),minn[i][j]=\max(minn[i][k]+minn[k][j])\)。
最后枚举 \(i,j\),判断 \(maxn[i][A],minn[j][B]\) 等大小关系即可。
P3084 [USACO13OPEN] Photo G
题意:有一个 01 序列,有若干限制形如 \([l,r]\) 中恰有一个 1,要求是否有解,有解还要求出最多有多少个 1。
思路:设 \(pre_i\) 为前 \(i\) 个位置有多少个 1,那么限制就形如 \(pre_r-pre_{l-1}=1\),又有 \(0\le pre_i-pre_{i-1}\le 1\),发现这就是一个差分约束问题,可以直接 spfa。不过这题数据范围稍大,需要一定的优化。
P3530 [POI2012] FES-Festival
题意:所有参赛者的成绩都是整数秒。他还会为你提供了一些参赛者成绩的关系。具体是:他会给你一些数对 \((A, B)\),表示 \(A\) 的成绩正好比 \(B\) 快 \(1\) 秒;他还会给你一些数对 \((C, D)\),表示 \(C\) 的成绩不比 \(D\) 慢。而你要回答的是:所有参赛者最多能达到多少种不同的成绩,而不违背他给的条件。
思路:容易发现是个差分约束的模型,但是求的确实不同成绩的最大数量。
考虑如果是一个强联通图,那么任意两个变量的差都有有限的上下限,那么我们选差最大的两个作为值域的两端,这样中间一定就都能取到。
考虑一般的情况,考虑求出所有强联通分量,对于每个 SCC 可以用上面的方法来求,而缩点后是个 DAG,就说明不存在相互的限制,那么每个 SCC 都可以单独来看,于是单独求解即可。
P4819 [中山市选] 杀人游戏
题意:有向图中有若干白点和一个黑点,每个点为黑点概率相等。每次可以任选一个点发起询问,询问结果为该点能直接到达的所有点的颜色。
求最优情况下不对黑点发起询问且得知黑点标号的概率。
思路:对于一个强联通分量,如果我们知道了一个点就可以知道全部的颜色。那么我们缩点,此时是一个 DAG,而且我们也只会问入度为 0 的点。
于是猜测答案就是 \(1-\dfrac{c}{n}\),\(c\) 表示入度为 0 的点数。
此时还漏掉了一种情况,就是如果可以只剩一个点没有确定时,可以不问这个点。
具体地,如果存在至少一个入度为 0 且大小为 1 的强联通分量,那么答案就是 \(1-\dfrac{c-1}{n}\)。
P4926 [1007] 倍杀测量者
题意:给出一系列不等式 \(x_{a_i}\ge (k_i-t)x_{b_i},x_{a_i}\le (k_i+t)x_{b_i}\),和一些 \(x_i\) 的值,求最大的 \(t\) 使得不等式无解。
思路:首先,答案肯定有单调性,可以二分答案。
常见的差分约束是差,并不是倍数,因此要想办法把乘积变成加和,那么就不难想到取 \(\log\),例如 \(x_{a_i}\ge (k-t_i)x_{b_i}\) 就等价于 \(\log_2(x_{a_i})\ge\log_2(x_{b_i})+\log_2(k_i-t)\),然后跑差分约束看是否有解即可。
P7916 [CSP-S 2021] 交通规划
题意:有 \(n\times m\) 的网格,内部有 \(2mn-m-n\) 个线段,还有 \(2m+2n\) 个射线露在外面,他们都有非负边权。每次给定 \(k\) 个在某射线上的点,它们已经被染成黑色或者白色,要求出将整个网格染色后,端点颜色不同的边的最小边权和。
思路:首先可以想到每次暴力跑最小割,但是复杂度稍高。
考虑怎么优化。我们发现这张图是网格图,根据 狼抓兔子,我们可以把平面图最小割转成对偶图最短路。
但是考虑到我们有不止 1 条射线的限制,这样用源汇连接所有黑白点后并不是平面图,不能直接处理。
我们先把相邻的同色射线合并,然后把不同色的区域两两匹配。可以发现我们的匹配不交是最优的,于是可以先暴力求出每个区域到其他区域的最短路,然后用区间 DP 来求最优的匹配。
复杂度 \(O(\sum k_imn\log(mn)+\sum(k_i^3))\)。
P7515 [省选联考 2021 A 卷] 矩阵游戏
题意:有一个 \(n\times m\) 的网格 \(a\),其中每个元素的范围是 \([0,10^6]\),现在给出矩阵 \(b\),满足 \(b[i][j]=a[i][j]+a[i][j+1]+a[i+1][j]+a[i+1][j+1]\),要求还原出 \(a\)。
思路:考虑如果我们知道了 \(a\) 的第一行和第一列,就可以直接推出整个矩阵,但是唯一的问题就是可以不满足每个元素都在 \([0,10^6]\) 之间,怎么办呢?
考虑调整。例如,我们可以对一行或者一列的奇数位加上 \(x\),偶数位减去 \(x\),这样和仍然不变。于是设 \(r_i\) 表示第 \(i\) 行加的值,\(c_i\) 表示第 \(i\) 列加上的值,那么矩阵大概就长这样:
发现有加有减,于是考虑把偶数位置上的 \(r_i\) 取反,把奇数位置上的 \(c_i\) 取反,就有:
然后发现这就是每个 \(i,j\) 会影响一个 \(r,c\),那么这就是差分约束模型,可以直接做。
P7516 [省选联考 2021 A/B 卷] 图函数
题意:对于一张 \(n\) 个点 \(m\) 条边的有向图 \(G\)(顶点从 \(1 \sim n\) 编号),定义函数 \(f(u, G)\):
- 初始化返回值 \(cnt = 0\),图 \(G' = G\)。
- 从 \(1\) 至 \(n\) 按顺序枚举顶点 \(v\),如果当前的图 \(G'\) 中,从 \(u\) 到 \(v\) 与从 \(v\) 到 \(u\) 的路径都存在,则将 \(cnt + 1\),并在图 \(G'\) 中删去顶点 \(v\) 以及与它相关的边。
- 第 \(2\) 步结束后,返回值 \(cnt\) 即为函数值。
现在给定一张有向图 \(G\),请你求出 \(h(G) = f(1, G) + f(2, G) + \cdots + f(n, G)\) 的值。
更进一步地,记删除(按输入顺序给出的)第 \(1\) 到 \(i\) 条边后的图为 \(G_i\)(\(1 \le i \le m\)),请你求出所有 \(h(G_i)\) 的值。
思路:考虑实际意义,相当于是在 \([1,i)\) 中有多少点满足循环到这个点时两点互相可达,更近一步地,可以发现等价于同时可以在不经过 \([1,x)\) 的点时从 \(x\) 到 \(i\) 和从 \(i\) 到 \(x\)。
于是考虑计算对答案有贡献的点对。
因为删边不好处理,考虑时光倒流,这样点对一定是越来越多,可以求出每个点对第一次的加入的时间,然后求一遍后缀和。
根据定义,我们容易想到可以用 floyd,从大到小枚举关键点,就可以计算答案了。
复杂度 \(O(n^3+m)\)。
P7520 [省选联考 2021 A 卷] 支配
题意:给一张有向图,多次询问,每次加入一条边,问有多少个点的支配集大小发生变化。
思路:因为 \(n\) 不大,可以 \(O(n^2)\) 求支配集,那么可以删掉一个点如果看剩下点是否可达,这样就可以求出支配集和一个点在支配树上的父亲。
然后考虑怎么解决询问。如果一个点的支配集大小要发生变化,可以只考虑父亲,即能否通过新加入的边在不经过妇父亲的情况下到这个点。
复杂度 \(O(n^2+nq)\)。
「JOISC 2014 Day3」电压
题意:JOI 公司的某个实验室中有着复杂的电路。电路由 N 个节点和 M 根细长的电阻组成。节点编号为 \(1\sim N\)。
每个节点可设定为两种电平之一:高电平或者低电平。每个电阻连接两个节点,只有一端是高电平,另一端是低电平的电阻才会有电流流过。两端都是高电平或者低电平的电阻不会有电流流过。
试求:有多少个电阻,可以通过调节各节点的电压,使得「没有电流流经该电阻,且其他 M-1 根电阻中都有电流流过」。
思路:首先容易看出充要条件:一条边合法当且仅当在所有奇环的交里,且不在任意一个偶环里。
然后考虑建出 dfs 树,计算每一条边在几个奇环和偶环中出现。
具体地,对于一条非树边,如果只有一个奇环,那么这条非树边就合法,否则如果两个奇环相交就会构成一个大偶环导致非树边不合法,不相交就会直接无解。于是求出树上合法的边数,再判断是否只有一个奇环即可。
「JOISC 2015 Day 1」卡片占卜
题意:有 ABCDE 5 个数,表示有一个序列 \(a\),顺次有 A 个 1,B 个 0,C 个 1,D 个 0,E 个 1,有 \(n\) 个区间,每次操作可以反转一个区间的 01,求最小的把序列变成全 1 的次数。
思路:做过类似的题目 Password,做法是大致相同的,就是用图论建模。
考虑对于一种操作 \([l,r]\),连边 \(l\rightarrow r+1\),这样我们可以用最短路求出反转任意区间的最小代价。
因为只用反转两个区间,反转的方式很少,可以简单判断。
「JOISC 2015 Day2」Keys
题意:JOI 社有 N 个社员,从 1 到 N 编号。社员出勤时间从时刻 0 到时刻 M。保证在时刻 0 和时刻 M 的时候,全体社员都在公司内。
今天,每个社员会恰好离开公司一次。第 i 个社员会在时刻 S_i 时刻离开公司,会在 T_i 时刻回到公司。保证不会同时有 2 个人同时离开或者回到公司。
JOI 社会社大楼有一个大门作为入口,所有社员必须从这个门进出公司。在公司内部可以自由的打开或者关闭这个门。但是在公司外的话,必须有钥匙才能打开或者关闭这个门。在时刻 0,门是关闭的。因此,第 i 个社员能在 T_i 时刻回到公司,当且仅当在 T_i 时刻的时候门开着,或者他有钥匙。
进门的社员和出门且有钥匙的社员可以选择是否去关门。当没有钥匙的社员离开时,他们无法锁门。
现在你有 K 把钥匙,你需要把这些钥匙给其中 K 个社员,使得第 i 个社员在 T_i 时刻都能够进入公司,并且从 0 时刻到 M 时刻,门被关着的时间最大。
思路:挺不错的题目。
容易想到考虑每一段时间的贡献。假设这一段开始是员工 A,结束是员工 B,有 4 种情况:
- A 进来,B 出去,这一段时间直接可以关门;
- A 进来,B 也进来,那么无论 A 是否有钥匙,只有 B 有钥匙这一段时间才可以关门;
- A 出去,B 也出去,和上一种类似,无论 B 是否有钥匙,只有 A 有钥匙这一段时间才可以关门;
- A 出去,B 进来,那么只有 A,B 都有钥匙这一段时间才可以开门。
我们观察贡献的形式,发现是形如如果一个人有钥匙那么会有一些时间可以关门,两个人都有钥匙那么有一些时间可以开门,如果转到图上,就等价于每个点有点权,有一些带边权的有向边,我们要给 k 个点染色,要使被染色的点的点权和加上两端都被染色的点的边权和最大。
同时我们可以发现更强的性质。对于一个点,出边和入边最多只有一条,而且起始点和终止点的度数都是 1,换言之,这张图的每个联通块都是链,那么就可以直接 DP 了。
具体地,我们设 \(f[i][j][0/1]\) 表示考虑到第 \(i\) 个点,已经给 \(j\) 个点染色,第 \(i\) 个点是否染色的最大贡献,转移时枚举 \(i-1\) 的状态和 \(i\) 的状态进行分类讨论即可。
「JOISC 2016 Day 4」危险的滑冰
题意:给出一个四周都是冰块的冰场,JOI 君在滑冰,每次滑冰只能在这个方向上最近的冰块旁停止,同时在它的起点位置产生一块冰块,问从起点到终点的最小代价。
思路:容易想到从一个地方开始停留到相邻的地方只需要两步,到冰块旁的地方停留只需要一步。现在有个问题,如果我们有可能重复利用之前放的冰块,那么我们就不好直接计算最小代价了,那么会不会有这种情况呢?
答案是不会的。因为我们从一个位置到一个我们停留过的位置再移动显然是没有直接从这个位置开始更优。
那么我们就可以直接建边跑最短路了。
「JOISC 2018 Day 1」栅栏
题意:IOI 国的土地可以表示为一个平面直角坐标系。他的土地为坐标系上 \(x,y\) 坐标满足 \(x \in [-10^{100}\, , \, 10^{100}] \, , \, y \in [-10^{100}\, , \, 10^{100}]\) 的区域。他的牧场是在坐标系上 \(x,y\) 满足 \(x \in [-S\, , \, S] \, , \, y \in [-S\, , \, S]\) 的区域。
JOI 君要在牧场里修一些栅栏,来把牧场围起来,使得他的牛不可能从牧场内的任何一点走到他的土地之外。栅栏是一条长度为正实数的线段。牧场里已经有一些栅栏了。两个栅栏之间如果有共同点,那么它必然是至少一个的栅栏的端点。
JOI 君可以随意建栅栏。要求栅栏既不在牧场内,也不在 JOI 君的土地外,它们的长度任意,方向任意。他甚至可以修一条将整个牧场全围起来的栅栏。建造一条长度为 l 的栅栏的费用是 l。两条栅栏可以相交,重合...... 怎么修都没问题(可参考样例)。
请你计算修栅栏的最小费用。
思路:又是计算几何。
我们需要画出一条闭合折线,并且能够把正方形包围。
考虑我们一定是把已有栅栏用新的栅栏连起来,或者是让已有栅栏和正方形边界连起来。因为栅栏不能在正方形内,我们把两个栅栏连接起来一定不会只用正方形一条边界的一部分,这样一定是不优的,因此我们可以把只把正方形的四个角当成栅栏,这样我们就只需要考虑连接两个栅栏的贡献了。
对于每一对栅栏,我们求出连接这两个栅栏最小的代价和这条线段。如果这条线段和正方形有交,我们就不能选,而且我们用其他方式连接这两个。现在问题就变成了找最小的环使得包含这个正方形。
对于判包含,我们可以从正方形中引出一条射线,如果这条射线经过了折线奇数次,就说明被包含了。
于是对于每一对栅栏,我们求出连接这两个点的线段经过了射线多少次,这样我们的问题就是求一个经过射线次数为奇数的最小环,可以用 Floyd 解决。
复杂度 \(O(n^3)\)。
「JOISC 2018 Day 4」野猪
题意:JOI 君是生活在 IOI 森林里的一头野猪。森林可视为一个包含 N 个结点,M 条带权无向边的连通图。结点的编号分别为 \(1\ldots N\)。i 号边连接结点 \(A_i\) 和 \(B_i\),权值为 \(C_i\)。保证 \((A_i,B_i)\neq(A_j,B_j)\),并且保证:对于任意两点互相可达。
开始时有一个长度为 L 的序列 \(X_1, X_2 \ldots X_L\),表示 JOI 君开始时在 \(X_1\),它要依次访问结点 \(X_2 \ldots X_L\)。序列中可能有重复结点,但保证序列中相邻两结点不同,即保证序列中 \(X_j\not=X_{j+1}\)。注意,不要求从 \(X_j\) 直达 \(X_{j+1}\),JOI 君可以从 \(X_j\) 出发,经过其他结点作为中转,再到达 \(X_{j+1}\)。但是,JOI 君不能沿原路返回前一个到达的结点。
接下来有 T 次修改,每次修改会给出两个整数 \(P_k, Q_k\),表示将 \(X_{P_{\scriptsize k}}\) 修改为 \(Q_k\)。每次修改后,JOI 君想知道:他能否找到满足要求的路径。如果能,请输出最短路的长度,反之则输出 -1。
思路:没想到图论还有 DDP。容易想到对于任意两点,维护最短路和初边、终边都不一样的次短路,但是这样是假的,有时候只会限制出边、终边中的一个,于是我们就维护 4 条路径。记 \(s,t\) 为初边终边,那么就是以下 4 种:
- \((s_1,t_1)\),最短路;
- \((s_2,t_2)\),其中 \(s_2\ne s_1,t_2\ne t_1\);
- \((s_3,t_3)\),其中 \(s_3\ne s_1,t_3\ne t_2\);
- \((s_4,t_4)\),其中 \(s_4\ne s_2,t_4\ne t_1\)。
这些路径可以用 \((min,+)\) 矩阵维护,然后这就是 DDP。
现在的问题是怎么求这 4 条路径。
因为和边关系密切,我们可以把无向边拆成两条有向边,然后求边间的最短路。
复杂度 \(O(m^2\log m+4^3n\log n)\)。