算是标准的dfs和bfs,唯一需要注意的是在搜索前要给每个vector进行一次从小到大排序,这样才能保证优先搜到更小的点。

排完序之后深搜一遍,宽搜一遍,分别用两个bool数组来记录点有没有被搜过就可以了。

#include <bits/stdc++.h>
using namespace std;

int n,m;

queue <int> q;
vector <int> a[100050];
bool judge[100050],judge2[100050];

void dfs(int x)
{
    cout<<x<<' ';
    for(int i=0;i<a[x].size();i++)
    {
        if(!judge[a[x][i]])judge[a[x][i]]=1,dfs(a[x][i]);
    }
    return;
}

void bfs(int x)
{
    cout<<x<<' ';
    for(int i=0;i<a[x].size();i++)
    {
        if(!judge2[a[x][i]])judge2[a[x][i]]=1,q.push(a[x][i]);
    }
    int temp;
    if(!q.empty())
    {
        temp=q.front();
        q.pop();
        bfs(temp);
    }
    return;
}

int main()
{
    int x,y;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin >> x >> y;     //用vector存图
        a[x].push_back(y);
    }
    for(int i=1;i<=n;i++)    //每组分别进行排序
    {
      sort(a[i].begin(),a[i].end());
    }
    judge[1]=1,judge2[1]=1;     //给一号点先打上标记
    dfs(1);
    cout<<endl;
    bfs(1);
    return 0;
}

 

更多推荐