图论专题--P5318 【深基18.例3】查找文献
·

算是标准的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;
}
更多推荐



所有评论(0)