题目链接:https://www.patest.cn/contests/pat-a-practise/1094
dfs
#include<bits/stdc++.h>
const int maxn =10010;
using namespace std;
vector<vector<int> >mp;
int n,m,a,k,t,maxt;
int level[maxn];
void dfs(int index,int lev){
level[lev]++;
maxt=max(maxt,lev);
for(int i=0;i<mp[index].size();i++)dfs(mp[index][i],lev+1);
}
int main(){
scanf("%d%d",&n,&m);
mp.resize(n+1);
for(int i=0;i<m;i++){
scanf("%d%d",&a,&k);
for(int j=0;j<k;j++){
scanf("%d",&t);
mp[a].push_back(t);
}
}
dfs(1,1);
int ans1=0,ans2=0;
for(int i=0;i<=maxt;i++){
if(ans1<level[i]){
ans1=level[i];
ans2=i;
}
}
printf("%d %d\n",ans1,ans2);
return 0;
}
bfs
#include<bits/stdc++.h>
const int maxn =10010;
using namespace std;
vector<vector<int> >mp;
int n,m,a,k,t;
int level[maxn];
int temp[maxn];
queue<int>q;
void bfs(int index,int lev){
temp[index]=1;
q.push(index);
while(q.size()){
index=q.front();q.pop();
level[temp[index]]++;
for(int i=0;i<mp[index].size();i++){
q.push(mp[index][i]);
temp[mp[index][i]]=temp[index]+1;
}
}
}
int main(){
scanf("%d%d",&n,&m);
mp.resize(n+1);
for(int i=0;i<m;i++){
scanf("%d%d",&a,&k);
for(int j=0;j<k;j++){
scanf("%d",&t);
mp[a].push_back(t);
}
}
bfs(1,1);
int ans1=0,ans2=0;
for(int i=0;i<=maxn;i++){
if(ans1<level[i]){
ans1=level[i];
ans2=i;
}
}
printf("%d %d\n",ans1,ans2);
return 0;
}
本文通过PAT-A 1094题目介绍了如何使用深度优先搜索(DFS)与广度优先搜索(BFS)解决树形结构中的节点层级遍历问题。详细展示了两种算法的实现过程,并比较了它们的特点。
459

被折叠的 条评论
为什么被折叠?



