Loading

题解:qoj#1824 Special Cycle

题目大意

给定一个 \(n\) 个点,\(m\) 条边的简单无向图,其中 \(K\) 条边是特殊边。要求构造一个简单环,使得所有特殊边要么在环上,要么两个端点都不在环上,或报告无解。

\(n\leq 150,K\leq m\leq \frac{n(n+1)}{2}\)

时间限制 \(12s\)

解法

考虑有解的条件。

如果一个点在环上,那么它相邻的所有特殊边都应该在环上。所以取出所有特殊边的子图中每个连通块同时在环中或者同时不在,那么一个连通块有几种可能:

  1. 存在一个度数大于等于 \(3\) 的点,则连通块中所有点都不能出现在答案中,全部删去;

  2. 是一个环,则可以直接作为答案;

  3. 是一条链,那么中间的二度点的所有非特殊边都没用,可以缩成一条边;

  4. 是一个单点。

现在问题转化成了所有特殊边都没有公共顶点的情况。接下来不断重复以下流程:

  1. 图中所有割边也不能在环中,将所有割边删去;
  2. 如果一条特殊边删去,它的端点也不能在答案中,也删去。

如果最后图被删空,否则可以证明剩下的图上可以构造出解:

我们通过对点数的归纳进行证明。点数不超过 \(3\) 的情况是显然的。

下面考虑更大的图。先假设所有边都不特殊,那么由边双连通性一定可以找到一个简单环。接下来依次考虑三种类型的每条特殊边 \(e\),并时刻找到一个在当前每条边特殊性下合法的环:

  1. 如果 \(e\) 在环上或与环无交,则直接合法;
  2. 如果 \(e\) 的两个端点都在环上,那么环上与 \(e\) 相邻的四条边都不是特殊的,所以取出这个环一边的弧和 \(e\) 共同组成环即可;
  3. 如果 \(e\) 的恰好一个端点在环上,那么将这个环所成一个点。由于在 \(e\) 变为特殊前环合法,所以缩点后这个点相邻的特殊边也只有 \(e\) 一条,同时不难说明边双连通性仍然保持,所以由归纳假设在这个新图上存在合法的环(这里的合法只考虑了 \(e\) 和在 \(e\) 之前变为特殊的边)。那么这个新图上环要么和原来的环无交,要么经过 \(e\),不难发现也可以取出环上的一边的弧构造出在原图上合法的环。

上面的证明实际上就描述了一个算法,不过归纳证明使得这个算法有些复杂。

既然得到了图合法的条件,那么可以考虑依次尝试删除每条边(如果是特殊边同时也删去端点),如果删边后不合法,则这条边要保留,否则就删去这条边,这样最后一定会得到一个环。

这个算法还可以进行一个小优化(对于下面的复杂度证明十分重要):如果成功删除一条边,在检验删除这条边是否合法的过程中会不断删去割边,接下来只需要在最后剩下的边双连通图上继续尝试删边。

这个算法的复杂度瓶颈在于找割边/边双连通分量,所以下面分析找割边的次数。

首先,尝试删除每条边后要先找一次割边,总共 \(O(m)\) 次,接下来:

  1. 如果成功删除,那么每次再找割边一定是因为上次找到的割边中有特殊边,导致删去这条边时也删去了端点。由于上面的优化,这些删除的点再也不会出现,所以这部分最多额外找 \(O(n)\) 次割边。
  2. 如果删除失败,那么同上判定过程中也至多找了 \(O(n)\) 次割边。但由于删除失败要还原图,所以这 \(O(n)\) 次不能摊到整张图上。但是注意到删除失败意味着找到了一条必须在答案中的边,而答案是简单环所以至多 \(O(n)\) 条边,所以至多删除失败 \(O(n)\) 次,总共 \(O(n^2)\) 次找割边。

综上,至多找 \(O(n^2+m)\) 次割边,总复杂度可以用 tarjan 算法做到 \(O((n^2+m)(n+m))\) 或用 bitset 优化 Kosaraju 算法做到 \(O((n^2+m)(\frac{n^2}{w}+n))\)

posted @ 2025-11-20 16:54  complexor  阅读(24)  评论(0)    收藏  举报