【圖論】B039_NK_蓄水池大作戰(dfs 遍歷)

一、Problem

在你面前有n個蓄水池,他們組成了樹形結構(由n-1條邊連接)。蓄水池節點編號從1開始到n。對每個蓄水池節點來說,他的兒子蓄水池節點都擺放在他的下面,並且和它用水管相連,根據重力,水會向下流動。現在我們要在蓄水池上做一些操作:

  1. 把節點v填滿水。然後v的所有兒子節點水也會被填滿
  2. 清空節點v的水。然後v所有的父親節點水都會被清空
  3. 詢問每個蓄水池節點是否有水。

初始狀態時候,每個節點都是空的。現在我們會依次進行一系列操作,我們想提前知道每次操作後的結果,你能幫忙解決嗎?


二、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();
    }
}

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(n)O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章