P14121 [SCCPC 2021] Don't Really Like How The Story Ends
题目描述
银河系中有 $n$ 个行星,许多无向曲速通道连接着它们。$6000$ 年前,Spinel 对这些行星进行了一次深度优先搜索,访问了所有的行星,并按照被发现的顺序将它们从 $1$ 到 $n$ 进行了标号。
自那以后,许多通道已经损坏,现在只剩下 $m$ 条通道可以使用。Spinel 想知道,需要修建多少条新的通道,才能保证能够进行一次深度优先搜索,并且访问顺序正好与 $6000$ 年前标号时完全一致。
回顾一下深度优先搜索 (DFS) 算法。它输入一个图 $G$ 和 $G$ 的一个顶点 $v$,并将所有从 $v$ 可达的顶点标记为已访问。
下面是递归实现 DFS 的伪代码:
```
procedure DFS(G, v) is
label v as discovered
for all vertices w that there exists an edge between v and w do
if vertex w is not labeled as discovered then
recursively call DFS(G, w)
```
输入格式
有多组测试数据。第一行包含一个整数 $T$,表示测试数据组数。对于每一组数据:
第一行包含两个整数 $n$ 和 $m$($1 \le n, m \le 10^5$),分别表示行星的数量和剩余通道的数量。
接下来的 $m$ 行中,第 $i$ 行包含两个整数 $u_i$ 和 $v_i$($1 \le u_i, v_i \le n$),表示存在一条连接 $u_i$ 和 $v_i$ 的通道。
保证所有测试数据中 $(n + m)$ 的总和不超过 $10^6$。
输出格式
对于每组测试数据,输出一行一个整数,表示至少需要修建多少条新的曲速通道。
说明/提示
对于第二组样例,可以在行星 $1$ 和 $2$ 之间添加一条通道,在行星 $2$ 和 $3$ 之间再添加一条通道。
对于第三组样例,可以在行星 $2$ 和 $3$ 之间添加一条通道。
由 ChatGPT 5 翻译