A1004 Counting Leaves BFS解法
简介
刚开始刷算法,当初学深度优先遍历和广度优先遍历的时候,就觉得广度优先遍历逻辑更加清楚、对新手也更友好,因此拿到这一题第一反应也就是bfs,后来看柳神题解发现只有dfs做法,心态小崩,再一看柳神代码行数30+(我的bfs写了60+),心态大崩(日常膜柳妈)。 但这并不意味着bfs算法复杂度更高。 谨贴上代码,以供参考。
题目介绍
题目链接
BFS(c++)
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
vector<int> v[100];
int book[100];
queue<int> q;
int depth=0;
int numd[100];
void bfs(){
int j=0;
while(!q.empty()){
int head=q.front();
j++;
q.pop();
if(v[head].size()==0){
book[depth]++;
}else{
for(int i=0;v[head][i]!=0;i++){
q.push(v[head][i]);
numd[depth+1]++;
}
}
if(j>=numd[depth]){
depth++;
j=0;
}
}
}
int main(){
q.push(1);
numd[0]=1;
int n, m, node, k, c;
scanf("%d %d", &n, &m);
if(n==0){
return 0;
}
for(int i = 0; i < m; i++) {
scanf("%d %d",&node, &k);
for(int j = 0; j < k; j++) {
scanf("%d", &c);
v[node].push_back(c);
}
}
bfs();
printf("%d",book[0]);
for(int i=1;i<depth;i++){
printf(" %d",book[i]);
}
return 0;
}
DFS(c++)
DFS写法参考柳神即可,我在柳神代码的基础上加了点注释 (尊重柳神版权 我就只贴一部分啦 完整版指路 柳婼 の blog
void dfs(int index, int depth) {
if(v[index].size() == 0) {
book[depth]++;
maxdepth = max(maxdepth, depth);
return ;
}
for(int i = 0; i < v[index].size(); i++)
dfs(v[index][i], depth + 1);
}
|