1004. Counting Leaves
阿新 • • 發佈:2018-11-26
struct 個數 std 圖片 front pre tps 幫助 using
題目信息:
題目的意思是找出樹中每一層的葉節點個數。
個人覺得難點在尋找每一層有哪些結點,或者說每一個結點在哪一層。題主的做法是用一個隊列來幫助我們記錄每一個葉節點的層數。
需要註意的是,輸入的數據可能是亂序的,也就是頭一列可能不是葉節點的,這個也是一個難點。
/* 題目:1004 */ /* 作者:ChanWunsam */ /* 時間:2017.12.19 */ #include <cstdio> #include <queue> #include <vector> #include <map> #include <string> #include <iostream> #include <cmath> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; struct TNode{ int childNum; int height; int *child; }; struct TNode FMTree[101]; int main() { int N, M, ID, childNum, childID, i, j, queue[101], front, rear, cnt[100], H, MaxH; cin>>N>>M; /* 初始化家庭樹 */ for(i=0; i<=N; i++) { FMTree[i].childNum=0; FMTree[i].height=0; cnt[i]=0; } /* 輸入數據 */ for(i=0; i<M; i++) { cin>>ID; cin>>childNum; FMTree[ID].childNum=childNum; //cout<<"ID:"<<ID<<" "<<FMTree[ID].height<<endl; FMTree[ID].child=(int *)malloc(childNum * sizeof(int)); for(j=0; j<childNum; j++) { cin>>childID; FMTree[ID].child[j]=childID; } } /* 建立樹層 */ front=rear=0; queue[rear++]=1; /* 根節點,很重要 */ while(rear-front) { ID=queue[front++]; for(i=0; i<FMTree[ID].childNum; i++) { j=FMTree[ID].child[i]; queue[rear++]=j; FMTree[j].height=FMTree[ID].height+1; } } /* 尋找無子樹結點 */ H=MaxH=0; for(i=1; i<=N; i++) { H=FMTree[i].height; if(!FMTree[i].childNum) cnt[H]++; if(H>MaxH) MaxH=H; } /* 輸出值 */ cout<<cnt[0]; for(i=1; i<=MaxH; i++) cout<<" "<<cnt[i]; return 0; }
雖然時間復雜度依舊被暴捶,但是好在這算是題主真正意義上獨立解決的一個問題(不過中間卡在了亂序的那個地方去尋找思路了),而且思路也和大佬們差不多。還是有點小滿足的。
上星期欠的債算是補了一部分了。。。。
1004. Counting Leaves