P5318 【深基18.例3】查找文献

图论中基本的深度与广度遍历,注意在遍历中如何保证先遍历编号小的结点。

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
vector<int> a[100100];
queue<int> dl;
bool b[100100];
int v,n;
void dfs(int i)
{
	if(b[i]!=0||i<1||i>v) return;
	b[i]=1;
	cout<<i<<" ";
	for(int j=0;j<a[i].size();j++)
	{
		dfs(a[i][j]);
	}
}
void bfs(int i)
{
	dl.push(i);
	b[i]=1;
	while(!dl.empty())
	{
		int x;
		x=dl.front();
		cout<<x<<" ";
		for(int j=0;j<a[x].size();j++)
		{
			if(b[a[x][j]]==0)
			{
				dl.push(a[x][j]);
				b[a[x][j]]=1;
			}
		}
		dl.pop();
	}
}
int main()
{
	cin>>v>>n;
	for(int i=1;i<=n;i++)
	{
		int x,y;
		cin>>x>>y;
		a[x].push_back(y);
	}
	for(int i=1;i<=v;i++)
	{
		sort(a[i].begin(),a[i].end());//保证编号小的结点优先被遍历到
	}
	dfs(1);
	memset(b,0,sizeof(b));
	cout<<endl;
	bfs(1);
} 

  

posted @ 2022-03-13 15:03  心悟&&星际  阅读(30)  评论(0编辑  收藏  举报