DFS:因为要知道有多少层,每次进DFS先更新一下最大层数
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 110;
vector<int>node[maxn];
int n, m;
int Layer[maxn];
int maxlayer = 0;
void DFS(int index, int layer)
{
maxlayer = max(maxlayer, layer);
if (node[index].size() == 0)
{
Layer[layer]++;
return;
}
for (int i = 0; i < node[index].size(); i++)
{
DFS(node[index][i], layer + 1);
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++)
{
int id, k;
scanf("%d%d", &id, &k);
while (k--)
{
int x;
scanf("%d", &x);
node[id].push_back(x);
}
}
DFS(1,1);
for (int i = 1; i <= maxlayer; i++)
{
printf("%d", Layer[i]);
if (i != maxlayer)printf(" ");
}
return 0;
}
BFS:注意maxlayer更新的位置,bfs都在q.pop()之后操作,不要在循环里操作
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 110;
struct node {
int layer;
vector<int>child;
}Node[maxn];
int Layer[maxn];
int n, m;
int maxlayer = 0;
void BFS(int root)
{
queue<int>q;
Node[root].layer = 1;
q.push(root);
while (!q.empty())
{
int top = q.front();
q.pop();
maxlayer = max(maxlayer, Node[top].layer);
if (Node[top].child.size())
{
for (int i = 0; i < Node[top].child.size(); i++)
{
int child = Node[top].child[i];
Node[child].layer = Node[top].layer + 1;
q.push(child);
}
}
else Layer[Node[top].layer]++;
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++)
{
int id, k;
scanf("%d%d", &id, &k);
while (k--)
{
int x;
scanf("%d", &x);
Node[id].child.push_back(x);
}
}
BFS(1);
for (int i = 1; i <= maxlayer; i++)
{
printf("%d", Layer[i]);
if (i != maxlayer)printf(" ");
}
return 0;
}