一、Problem
在你面前有n個蓄水池,他們組成了樹形結構(由n-1條邊連接)。蓄水池節點編號從1開始到n。對每個蓄水池節點來說,他的兒子蓄水池節點都擺放在他的下面,並且和它用水管相連,根據重力,水會向下流動。現在我們要在蓄水池上做一些操作:
- 把節點v填滿水。然後v的所有兒子節點水也會被填滿
- 清空節點v的水。然後v所有的父親節點水都會被清空
- 詢問每個蓄水池節點是否有水。
初始狀態時候,每個節點都是空的。現在我們會依次進行一系列操作,我們想提前知道每次操作後的結果,你能幫忙解決嗎?
二、Solution
方法一:dfs 遍歷圖
坑點:沒有顯式地告訴你 1 就是根節點,子節點的編號都比父節點要小,其它正常…
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
static class Solution {
int n, full[];
Set<Integer> g[];
void dfs(int u, int op) {
full[u] = op == 1 ? 1 : 0;
for (int v : g[u]) {
if (op == 1 && v > u) {
dfs(v, op);
} else if (op == 2 && v < u) {
dfs(v, op);
}
}
}
void init() {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
n = sc.nextInt();
g = new HashSet[n+5];
full = new int[n+5];
for (int i = 1; i < g.length; i++)
g[i] = new HashSet<>();
for (int i = 0; i < n-1; i++) {
int a = sc.nextInt(), b = sc.nextInt();
g[a].add(b);
g[b].add(a);
}
int q = sc.nextInt();
for (int i = 0; i < q; i++) {
int c = sc.nextInt(), v = sc.nextInt();
if (c == 3) {
System.out.println(full[v]);
continue;
}
dfs(v, c);
}
}
}
public static void main(String[] args) throws IOException {
Solution s = new Solution();
s.init();
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,