题目描述
小哈喜欢翻看博客获取知识。每篇文章可能会有若干个(也有可能没有)参考文献的链接指向别的博客文章。小哈求知欲旺盛,如果他看了某篇文章,那么他一定会去看这篇文章的参考文献(如果他之前已经看过这篇参考文献的话就不用再看它了)。
假设博客里面一共有n篇文章(编号为 1 到 n)以及m条参考文献引用关系。目前小哈 已经打开了编号为 1 的一篇文章,请帮助小哈 设计一种方法,使小哈可以不重复、不遗漏的看完所有他能看到的文章。
输入描述
第一行两个数字n和m 后m行,每行两个数字x,y代表x有一条到y的链接
输出描述
第一行为DFS结果 第一行为BFS结果 每个数字之间有一个空格
输入输出样例
💡
-
输入
8 9 1 2 1 3 1 4 2 5 2 6 3 7 4 7 4 8 7 8
输出
1 2 5 6 3 7 8 4 1 2 3 4 5 6 7 8
提示
请对这个图分别进行 DFS 和 BFS,并输出遍历结果。如果有很多篇文章可以参阅,请先看编号较小的那篇(因此你可能需要先排序)。
#include<bits/stdc++.h>
using namespace std;
const int N =1e5+50;
int n,m,vis[N],cnt;;
vector<int> v[N],ans;
void dfs(int x){
//2024年4月13日22:22:22
vis[x]=1;
ans.push_back(x);
//cout<<x<<' ';
for(int i=0;i<v[x].size();i++){
int y=v[x][i];
if(vis[y]==0)dfs(y);
}
}
void bfs(int st)
{
queue<int>q;
q.push(st);
ans.push_back(st);
vis[st]=1;
//cout<<st<<' ';
while(q.size()){
int x=q.front();
q.pop();
for(int i=0;i<v[x].size();i++){
int y=v[x][i];
if(vis[y]==0){
q.push(y);
ans.push_back(y);
vis[y]=1;
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
v[x].push_back(y);
}
for(int i=1;i<=n;i++){
sort(v[i].begin(),v[i].end());
}
dfs(1);
for(int i=0;i<ans.size()-1;i++){
cout<<ans[i]<<' ';
}
cout<<ans[ans.size()-1];
ans.clear();
memset(vis,0,sizeof(vis));
cout<<endl;
bfs(1);
for(int i=0;i<ans.size()-1;i++){
cout<<ans[i]<<' ';
}
cout<<ans[ans.size()-1];
return 0;
}
求评论,关注~~