查找文章(搜索)

题目描述

小哈喜欢翻看博客获取知识。每篇文章可能会有若干个(也有可能没有)参考文献的链接指向别的博客文章。小哈求知欲旺盛,如果他看了某篇文章,那么他一定会去看这篇文章的参考文献(如果他之前已经看过这篇参考文献的话就不用再看它了)。

假设博客里面一共有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;
}

求评论,关注~~

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值