深搜(dfs)
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
深搜(dfs)
题目描述
苗苗正在阅读一段图搜索程序。程序使用深度优先搜索,代码如下:
vector<vector<int>> g(n + 1);
vector<int> all_vertices;
vector<int> output;
vector<int> visited(n + 1, 0);
void dfs(int u) {
visited[u] = 1;
output.push_back(u);
for (int v : g[u]) {
if (!visited[v]) {
dfs(v);
}
}
}
void run_dfs() {
for (int v : all_vertices) {
if (!visited[v]) {
dfs(v);
}
}
}
这段程序中有两个顺序没有被固定:每个 g[u] 中相邻点的顺序可以任意决定;all_vertices 中所有点的顺序也可以任意决定。
现在给定一张 个点、 条边的无向图,以及一个排列 。苗苗可以向图中加入若干条无向边。她希望在加入这些边之后,存在一种枚举顺序,使得程序输出点的顺序恰好为
请你求出至少需要加入多少条边。
可以证明,一定存在合法方案。
输入格式
从文件 dfs.in 中读入数据。
第一行两个整数 。
接下来 行,每行两个整数 ,表示图中有一条连接 和 的无向边。
最后一行 个整数 ,表示希望得到的输出顺序。
输出格式
输出到文件 dfs.out 中。
输出一行一个整数,表示至少需要加入的边数。
输入输出样例 #1
输入 #1
6 6
1 3
1 4
2 3
3 4
3 6
5 6
1 2 3 4 5 6
输出 #1
2
说明/提示
至少需要加入 条边。例如加入边 和 后,可以通过合适地选择枚举顺序,使 DFS 的输出顺序为 1 2 3 4 5 6。
对于全部数据,满足:
- ;
- ;
- ,;
- 同一条无向边不会重复出现;
- 是 到 的一个排列。
| 测试点编号 | 特殊性质 | ||
|---|---|---|---|
| 无 | |||
| A | |||
| 无 | |||
| A | |||
| 无 | |||
特殊性质 A:保证 。