今天上午去学开车,下午打比赛(划水),晚上又在看中国新说唱。。。一直没刷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;
}