PAT准备之2018.7.21

今天上午去学开车,下午打比赛(划水),晚上又在看中国新说唱。。。一直没刷PAT,结果一直等到半夜,第二天就开始中断是一个不好的行为啊。。。不要再拖延了。。。

今天只做了1004,说实话是一道比较裸的题目了,结果自己还是用了这么多时间。。
链接
1004 Counting Leaves (30)(30 分)
就是给你一棵树,让你求出每一层中没有孩子的节点(叶子节点)的个数(。直接BFS就可以了,不过记得要先把所以入度为0的点放入队列。

代码如下:

#include<bits/stdc++.h>

using namespace std;
const int MAX = 110;
set<int> st[MAX],vis;
int N,M;
int In[MAX];
void BFS(){
    queue<int> que;
    vector<int> vec,res;
    int sum = 0;
    //先把所有入度为0的节点放入
    for(int i=1;i<=N;++i){
        if(!In[i]){
            que.push(i);
        }
    }
    while(!que.empty()){
        int v = que.front();que.pop();
        //记录叶子节点
        if(st[v].size() == 0){
            sum++;
        }
        else{
            for(set<int>::iterator it = st[v].begin();it != st[v].end();++it){
                vec.push_back(*it);
            }
        }
        if(que.empty()){
            for(vector<int>::iterator it = vec.begin();it != vec.end();++it){
                que.push(*it);
            }
            vec.clear();
            res.push_back(sum);
            sum = 0;
        }
    }
    for(int i=0;i<res.size();++i){
        cout << res[i];
        if(i != res.size()-1)
            cout << " ";
        else
            cout << endl;
    }
}
int main(void){
    memset(In,0,sizeof(In));
    cin >> N >> M;
    int Id,K,Child;
    for(int i=1;i<=M;++i){
        cin >> Id >> K;
        for(int j=1;j<=K;++j){
            cin >> Child;
            In[Child]++;
            st[Id].insert(Child);
        }
    }
    BFS();

    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhao5502169/article/details/81150847