1. 程式人生 > >1004. Counting Leaves

1004. Counting Leaves

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