图论-DFSandBFS

深度优先遍历:

算法步骤(递归):
①初始化图中所有顶点未被访问
②从图中的某个顶点v出发,访问v并标记已访问
③依次检查v的所有邻接点w,如果w未被访问,则从w出发进行深度优先遍历,重复②和③

在这里插入图片描述

Code:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N,M;
vector<vector<int>>Edge;//创建邻接表 
vector<bool>visit;//存储标志
void DFS(int x){
	visit[x]=true;
	cout<<x<<" ";
	for(int i=0;i<Edge[x].size();i++)
		if(!visit[Edge[x][i]])
			DFS(Edge[x][i]);
}
int main(){
	cin>>N>>M;
	Edge.resize(N+1);
	visit.resize(N+1);
	for(int i=1;i<=M;i++){
		int a,b;
		cin>>a>>b;
		Edge[a].push_back(b);
		Edge[b].push_back(a);
	}
	cout<<"深搜顺序:"<<endl;
	DFS(1);
	return 0;
}
//测试数据 
//8 9
//1 2
//1 3
//2 4
//2 5
//2 6
//3 7
//3 8
//4 5
//7 8

广度优先遍历:

算法步骤:
①初始化图中所有顶点未被访问,初始化一个空队列
②从图中的某个顶点v出发,访问v并标记已访问,将v入队
③如果队列非空,则继续执行,否则算法结束
④队头元素v出队,依次访问v的所有未被访问邻接点,标记已访问并入队,转向③

在这里插入图片描述

Code:

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int N,M;
vector<vector<int>>Edge;//创建邻接表 
vector<bool>visit;//存储标志
void BFS(int x){
	queue<int>Q;//创建队列
	Q.push(x);//入队
	visit[x]=true;//标记已访问
	int T;
	while(!Q.empty()){//判断队列是否为空 
		T=Q.front();//找出队头元素
		cout<<T<<" ";
		Q.pop();//弹出
		for(int i=0;i<Edge[T].size();i++){
			if(!visit[Edge[T][i]]){//节点未被访问 
				Q.push(Edge[T][i]);//入队 
				visit[Edge[T][i]]=true;//标记为已访问 
			}
		} 
	} 
}
int main(){
	cin>>N>>M;
	Edge.resize(N+1);
	visit.resize(N+1);
	for(int i=1;i<=M;i++){
		int a,b;
		cin>>a>>b;
		Edge[a].push_back(b);
		Edge[b].push_back(a);
	}
	cout<<"广度优先遍历:"<<endl;
	BFS(1);
	return 0;
}
//测试数据 
//8 9
//1 2
//1 3
//2 4
//2 5
//2 6
//3 7 
//3 8
//4 5
//7 8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值