【提煉翻譯+解題】PTA 1004 Counting Leaves 僅用vector 共40行
阿新 • • 發佈:2018-12-24
題目大意
Input:
第一行 M N 分別是 總節點個數 非葉節點個數
接下來的N行中的某一行: 第一個值ID為當前非葉節點序號 K為有幾個孩子 然後依次是K個孩子的節點序號
例如
01
02 03
04 ←這樣一棵樹
有:M = 4 N = 2
ID = 01 K = 2 02 03
ID = 02 K = 1 04
Output:
輸出每一層有幾個葉節點
此用例應該輸出
0 1 1
#include<iostream> #include<vector> using namespace std; vector<int> node,res;//node 當前下標位置對應的節點序號, res 儲存第i層有幾片葉子 vector<vector<int> > nodpos; //2列的二維陣列 分別儲存在node的下標位置和孩子個數 int ct = 0; void solve(int pos,int n,int t){ if(n == 0) { res[t] ++; //遞迴t次滿足條件 故第t層++ ct = max(ct,t); return; } for(int i = 0; i < n ; i++) solve(nodpos[node[pos+i]][0],nodpos[node[pos+i]][1],t+1); } int main(){ int m,n,allcount = 1,nd,cnt,i = 1; cin >> m >> n; node = vector<int>(m+1,0); nodpos = vector<vector<int> >(m+1,vector<int>(2,0)); res = vector<int>(m+1,0); for(int i = 0; i < n ; i ++){ cin >> nd; nodpos[nd][0] = allcount; cin >> cnt; nodpos[nd][1] = cnt; for(int j = 0; j < cnt; j++){ cin >> node[allcount]; allcount++; } } solve(nodpos[1][0],nodpos[1][1],0); //進入DFS while(i<=ct){ cout << res[i] ; if(i!=ct)cout<< " "; i++; } return 0; }