# DFS# Tree# Graph

d459 - 一棵小樹

🔗 前往 ZeroJudge 原題

題目描述

題目給定一棵以節點 1 為根的樹,要求輸出每個節點以下(包含自身)的節點數量。

解題思路

這題可以使用深度優先搜尋 (DFS) 來解決。從根節點 1 開始,遞迴地計算每個節點以下的節點數量。對於每個節點,我們遍歷它的所有子節點,遞迴地計算子節點以下的節點數量,然後將這些數量加總,再加上自身節點,即可得到該節點以下的節點總數。

複雜度分析

  • 時間複雜度: O(N),其中 N 是節點的數量。因為 DFS 會遍歷所有節點和邊。
  • 空間複雜度: O(N),主要來自於 t (鄰接表) 和 ans 陣列,以及 DFS 的遞迴呼叫堆疊。在最壞情況下,樹可能是一個鏈狀結構,遞迴深度為 N。

程式碼

#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
int n,x,y;
vector <int> t[20001];
int ans[20001];
int dfs(int it,int fa){
	if(t[it].size()==0){
		ans[it]=1;
		return 1;
	}
	int tmp=1;
	for(int i=0;i<t[it].size();++i){
		if(t[it][i]!=fa)tmp+=dfs(t[it][i],it);
	}
	ans[it]=tmp;
	return tmp;
}
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> n;
	for(int i=1;i<n;++i){
		cin >> x >> y;
		t[y].push_back(x);
		t[x].push_back(y);
	}
	dfs(1,1);
	for(int i=1;i<=n;++i){
		cout  << setw(5) << right <<  i << '-' << setw(5) << right << ans[i] << "\n";
	}
}

Discussion