正好通过PAT好好学习了下c++
这些代码都是我边读边理解算法和c ++,侵删,柳婼姐一定不会生气的
这段代码很好的诠释了DFS的思想
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v[100];
int book[100], maxdepth = -1;
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);
}
int main() {
int n, m, k, node, c;
scanf("%d %d", &n, &m);
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);
}
}
dfs(1, 0);
printf("%d", book[0]); //先输出第0层的
for(int i = 1; i <= maxdepth; i++)
printf(" %d", book[i]);
return 0;
}
太好了,BFS也想起来了。
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int level[100], book[100], maxlevel = -1;
vector<int> v[100];
void bfs() {
queue<int> q;
q.push(1);
level[1] = 0; //这个点所在的层数
while(!q.empty()) {
int index = q.front();
q.pop();
maxlevel = max(level[index], maxlevel);
if(v[index].size() == 0)
book[level[index]]++;
for(int i = 0; i < v[index].size(); i++) {
q.push(v[index][i]); //先把这一层的全部弹入,再一个一个弹出
level[v[index][i]] = level[index] + 1;
}
}
}
int main() {
int n, m, k, node, c;
scanf("%d %d", &n, &m);
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 <= maxlevel; i++)
printf(" %d", book[i]);
return 0;
}