PAT 甲級 1004 Counting Leaves【n叉樹層次遍歷】

還是代碼寫的少,有點手生,寫了好久。。。。

題目很明瞭,求一個家族樹上每一代人有多少沒有孩子的,就是求樹的每一層上有多少沒有子結點的,層次遍歷計數就好了。

//1004

//數組a用來存數據,第一個維度指結點編號,第二個維度中a[i][0]表示結點i是否有孩子
//a[i][1]爲k,a[i][2]以及以後表示i結點的所有孩子編號
int a[100][205];

int main(){

    int n,m,nod,k;
    while(scanf("%d%d",&n,&m)!=EOF&&n){
        for(int p=0;p<m;p++){
            scanf("%d %d",&nod,&k);
            a[nod][0] = 1;
            a[nod][1] = k;
            for(int i=2;i<=a[nod][1]+1;i++) scanf("%d",&a[nod][i]);
        }

        queue<int> q;
        vector<int> ans;
        bool onlyroot = false;
        int cnt = 0 ,all = 0;
        q.push(1);
        if(!a[1][0]) {onlyroot = true;ans.push_back(1);}//如果只有一個根節點

        while(1){
            if(onlyroot) break; //如果只有一個根節點
            if(all>=n) break;//所有點都算過了

            //所有這一層出隊,下一層入隊
            int len = q.size();
            all+=len;
            while(len--)
            {
                int t = q.front();q.pop();
                if(!a[t][0]) cnt++;
                for(int i=0;i<a[t][1];i++)
                {
                    q.push(a[t][i+2]);
                }

            }
            ans.push_back(cnt);
            cnt = 0;
        }

        for(int i=0;i<ans.size();i++)
        {
            printf("%d",ans[i]);
            if(i<ans.size()-1) printf(" ");
        }
        printf("\n");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章