A12150 | DFS
时间限制1s
内存限制256MB
通过 / 提交0/0
题目描述
Let $T$ be a tree on $n$ vertices. Consider a graph $G_0$ , initially equal to $T$ . You are given a sequence of $q$ updates, where the $i$ -th update is given as a pair of two distinct integers $u_i$ and $v_i$ .
For every $i$ from $1$ to $q$ , we define the graph $G_i$ as follows:
- If $G_{i-1}$ contains an edge $\{u_i, v_i\}$ , then remove this edge to form $G_i$ .
- Otherwise, add this edge to $G_{i-1}$ to form $G_i$ .
Formally, $G_i := G_{i-1} \triangle \{\{u_i, v_i\}\}$ where $\triangle$ denotes the set [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference).
Furthermore, it is guaranteed that $T$ is always a subgraph of $G_i$ . In other words, an update never removes an edge of $T$ .
Consider a connected graph $H$ and run a depth-first search on it. One can see that the tree edges (i.e. the edges leading to a not yet visited vertex at the time of traversal) form a spanning tree of the graph $H$ . This spanning tree is not generally fixed for a particular graph — it depends on the starting vertex, and on the order in which the neighbors of each vertex are traversed.
We call vertex $w$ good if one can order the neighbors of each vertex in such a way that the depth-first search started from $w$ produces $T$ as the spanning tree. For every $i$ from $1$ to $q$ , find and report the number of good vertices.
For every $i$ from $1$ to $q$ , we define the graph $G_i$ as follows:
- If $G_{i-1}$ contains an edge $\{u_i, v_i\}$ , then remove this edge to form $G_i$ .
- Otherwise, add this edge to $G_{i-1}$ to form $G_i$ .
Formally, $G_i := G_{i-1} \triangle \{\{u_i, v_i\}\}$ where $\triangle$ denotes the set [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference).
Furthermore, it is guaranteed that $T$ is always a subgraph of $G_i$ . In other words, an update never removes an edge of $T$ .
Consider a connected graph $H$ and run a depth-first search on it. One can see that the tree edges (i.e. the edges leading to a not yet visited vertex at the time of traversal) form a spanning tree of the graph $H$ . This spanning tree is not generally fixed for a particular graph — it depends on the starting vertex, and on the order in which the neighbors of each vertex are traversed.
We call vertex $w$ good if one can order the neighbors of each vertex in such a way that the depth-first search started from $w$ produces $T$ as the spanning tree. For every $i$ from $1$ to $q$ , find and report the number of good vertices.
输入格式
The first line contains two integers $n$ and $q$ ( $3 \le n \le 2\cdot 10^5$ , $1 \le q \le 2 \cdot 10^5$ ) — the number of nodes and the number of updates, respectively.
Each of the next $n-1$ lines contains two integers $u$ and $v$ ( $1 \le u, v \le n$ , $u \ne v$ ) — vertices connected by an edge in $T$ . It is guaranteed that this graph is a tree.
Each of the next $q$ lines contains two integers $u$ and $v$ ( $1 \le u, v \le n$ , $u \ne v$ ) — the endpoints of the edge that is added or removed. It is guaranteed that this edge does not belong to $T$ .
Each of the next $n-1$ lines contains two integers $u$ and $v$ ( $1 \le u, v \le n$ , $u \ne v$ ) — vertices connected by an edge in $T$ . It is guaranteed that this graph is a tree.
Each of the next $q$ lines contains two integers $u$ and $v$ ( $1 \le u, v \le n$ , $u \ne v$ ) — the endpoints of the edge that is added or removed. It is guaranteed that this edge does not belong to $T$ .
输出格式
For each update, print one integer $k$ — the number of good vertices $w$ after the corresponding update.
输入输出样例
输入 #1
3 2 1 2 1 3 2 3 3 2
输出 #1
2 3
输入 #2
6 6 1 2 2 3 1 4 4 5 1 6 2 5 3 4 5 2 6 4 3 4 6 5
输出 #2
3 2 3 2 3 2
The first sample is depicted in the following figure.
After the first update, $G$ contains all three possible edges. The result of a DFS is as follows:
- Let the starting vertex be $1$ . We have two choices of ordering the neighbors of $1$ , either $[2, 3]$ or $[3, 2]$ .
- If we choose the former, then we reach vertex $2$ . Regardless of the ordering of its neighbors, the next visited vertex will be $3$ . Thus, the spanning tree generated by this DFS will contain edges $\{1, 2\}$ and $\{2, 3\}$ , which does not equal to $T$ .
- If we choose the latter, we obtain a spanning tree with edges $\{1, 3\}$ and $\{2, 3\}$ .
Hence, there is no way of ordering the neighbors of vertices such that the DFS produces $T$ , and subsequently $1$ is not a good vertex.
- Let the starting vertex be $2$ . We have two choices of traversing its neighbors. If we visit $3$ first, then the spanning tree will consist of edges $\{2,3\}$ and $\{1,3\}$ , which is not equal to $T$ . If we, however, visit $1$ first, then we can only continue to $3$ from here, and the spanning tree will consist of edges $\{1, 2\}$ and $\{1,3\}$ , which equals to $T$ . Hence, $2$ is a good vertex.
- The case when we start in the vertex $3$ is symmetrical to starting in $2$ , and hence $3$ is a good vertex.
Therefore, the answer is $2$ .After the second update, the edge between $2$ and $3$ is removed, and $G = T$ . It follows that the spanning tree generated by DFS will be always equal to $T$ independent of the choice of the starting vertex. Thus, the answer is $3$ .
In the second sample, the set of good vertices after the corresponding query is:
- $\{2, 3, 5\}$
- $\{3, 5\}$
- $\{3, 4, 5\}$
- $\{4, 5\}$
- $\{4, 5, 6\}$
- $\{5, 6\}$
After the first update, $G$ contains all three possible edges. The result of a DFS is as follows:
- Let the starting vertex be $1$ . We have two choices of ordering the neighbors of $1$ , either $[2, 3]$ or $[3, 2]$ .
- If we choose the former, then we reach vertex $2$ . Regardless of the ordering of its neighbors, the next visited vertex will be $3$ . Thus, the spanning tree generated by this DFS will contain edges $\{1, 2\}$ and $\{2, 3\}$ , which does not equal to $T$ .
- If we choose the latter, we obtain a spanning tree with edges $\{1, 3\}$ and $\{2, 3\}$ .
Hence, there is no way of ordering the neighbors of vertices such that the DFS produces $T$ , and subsequently $1$ is not a good vertex.
- Let the starting vertex be $2$ . We have two choices of traversing its neighbors. If we visit $3$ first, then the spanning tree will consist of edges $\{2,3\}$ and $\{1,3\}$ , which is not equal to $T$ . If we, however, visit $1$ first, then we can only continue to $3$ from here, and the spanning tree will consist of edges $\{1, 2\}$ and $\{1,3\}$ , which equals to $T$ . Hence, $2$ is a good vertex.
- The case when we start in the vertex $3$ is symmetrical to starting in $2$ , and hence $3$ is a good vertex.
Therefore, the answer is $2$ .After the second update, the edge between $2$ and $3$ is removed, and $G = T$ . It follows that the spanning tree generated by DFS will be always equal to $T$ independent of the choice of the starting vertex. Thus, the answer is $3$ .
In the second sample, the set of good vertices after the corresponding query is:
- $\{2, 3, 5\}$
- $\{3, 5\}$
- $\{3, 4, 5\}$
- $\{4, 5\}$
- $\{4, 5, 6\}$
- $\{5, 6\}$
C++ 编辑器
输入
输出
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录
状态说明时间源码
AI
作答助手
你好,我是作答助手。可以问思路、复杂度、样例含义或代码报错原因;不会直接给出完整 AC 代码。
确定要清空代码吗?
提交通过
评测结果:Accepted