## DFS 序 首先是 DFS 序(Depth-First Search Order)。DFS 序是在深度優先搜索過程中,記錄節點訪問的順序。具體來說,DFS 序是在進入 dfs 的時候與出去 dfs 的時候會將點分別加入 stack 中。 讓我們通過一個示例來理解 DFS 序。考慮下面的樹結構:
```mermaid graph TD; center[ ] A(1) B(2) C(3) D(4) E(5) F(6) A --- B A --- E B --- C B --- D E --- F style center fill:transparent,stroke:none; ``` dfs 序 = [1, 2, 3, 3, 4, 4, 2, 5, 6, 6, 5, 1]
## 歐拉序 歐拉序是通過從樹的根節點開始,按照 DFS 遍歷的順序訪問每個節點的方式得到的序列。具體來說,當我們遇到一個節點時,將其加入到序列中;當我們返回右再次遇到這個節點時,也將其加入到序列中,而 dfs order 是只有在要離開一個點時才加入。
![Image title](./images/84.png){ width="300" }
euler tour = [A, B, C, B, D, E, D, F, D, B, G, B, A, H, I, H, A]
歐拉序又稱 euler tour,將 dfs 依序碰到的點都列出來。每條邊走過一次會恰貢獻一個點,而每條邊會走過兩次,所以相當於 $2n-2$ 個點,但還要加上起點,所以歐拉序的長度是 $2n-1$ ??? question "換根後 euler tour 序列 order 不變"
![Image title](./images/29.png){ width="200" }
上圖的歐拉序列為 $$[1,2,3,2,1,5,6,5,1,4,1]$$ 我們將歐拉序列延伸一倍,相當於表示成一個環 $$[1,2,3,2,1,5,6,5,1,4,1,1,2,3,2,1,5,6,5,1,4,1]$$ 那換以 $5$ 為根呢 ? $$[1,2,3,2,1,5,6,\underbrace{5,1,4,1,1,2,3,2,1,5,6,5},1,4,1]$$ ## 例題 ???+note "[CSES - path queries](https://cses.fi/problemset/task/1138)" 給定一個有根樹,點編號 $1,2,\ldots, n$,$1$ 是 root 每個節點一開始都有一個 value $q$ 個操作,每次會是以下一種 : - $\text{modify}(x,v):$ 把節點 $x$ 的 value 變成 $v$ - $\text{sum}(rt,x):$ 求 $\texttt{root} \to \ldots \to x$ 的 value 總和 $n,m\le 2\times 10^5$ ??? note "思路" 建立 DFS 序 每次要 query 時計算 $1\sim \texttt{in}[x]$ 要修改某個點值就將 $\texttt{in}[x],\texttt{out}[x]$ 都修改成該值 ???+note "[CSES - Subtree Queries](https://cses.fi/problemset/task/1137)" 給定一個有根樹,點編號 $1,2,\ldots, n$,$1$ 是 root 每個節點一開始都有一個 value $q$ 個操作,每次會是以下一種 : - $\text{modify}(x,v):$ 把節點 $x$ 的 value 變成 $v$ - $\text{SubtreeSum}(x):$ 求 $x$ 的子樹的 value 總和 $n,m\le 2\times 10^5$ ??? note "思路" 建立 DFS 序 每次要 query 時計算 $\texttt{in}[x]\sim \texttt{out}[x]-1$ 要修改某個點值就將 $\texttt{in}[x]$ 修改成該值 ???+note "[全國賽 2021 pG](https://tioj.ck.tp.edu.tw/problems/2257)" 給定一棵 $n$ 點有根樹,一開始每條邊權重都是 $1$ $q$ 個操作,每次會是以下一種 : - 把某條邊的權重變 $0$ - 詢問根節點到某一節點的權重和 $n,q\le 10^5$ ??? note "思路" 建立 DFS 序 每次要 query 時計算 $1\sim \texttt{in}[x]$ 修改 $\texttt{edge}(u,v):$ 將 $\texttt{in}[v]+x,\texttt{out}[u]-x$