图的遍历--深搜、广搜

#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
const int maxn = 1000;
int a[maxn];
bool inqueue[maxn] = {false};//记录广搜时结点是否入队 
bool visit[maxn] = {false};//记录深搜时结点是否已被访问 
int G1[maxn][maxn] = {0};//邻接矩阵 
vector<int> G2[maxn];//邻接表 
int n;//结点个数 

首先深搜,用邻接矩阵存储和邻接表存储有一些不同之处

//深度优先,邻接矩阵存储 
void DFS1(int root){
	visit[root] = true;
	//对结点的操作
	for(int i= 0;i < n;i ++){
		if(visit[i] == false && G1[root][i] > 0){//结点未被访问,且存在此条边 
			DFS1(i); 
		} 
	}
} 
void DFSTravel1(){
	for(int i = 0;i < n;i ++){
		if(visit[i] == false){
			DFS1(i);
		}
	}
}

//深度优先,邻接表存储
void DFS2(int root){
	visit[root] = true;
	for(int i = 0;i < G2[root].size();i ++){
		if(visit[G2[root][i]] == false){
			DFS2(G2[root][i]);
		}
	}
} 
void DFSTravel2(){
	for(int i = 0;i < n;i ++){
		if(visit[i] == false){
			DFS2(i);
		}
	}
}

广搜

//广度优先,邻接矩阵存储
void BFS1(int root){
	queue<int> q;
	q.push(root);
	inqueue[root] = true;
	//对结点的操作
	while(!q.empty()){
		int temp = q.front();
		for(int i = 0;i < n;i ++){
			if(inqueue[i] == false && G1[temp][i] > 0){//结点未被访问,且存在此条边 
				q.push(i);
				inqueue[i] = true;
			}
		}
		q.pop();//所有下一层节点入队后,队首结点出队 
	} 
} 
void BFS1Travel(){
	for(int i = 0;i < n;i ++){
		if(inqueue[i] == false){
			BFS1(i);
		}
	}
} 

//广度优先,邻接表存储
void BFS2(int root){
	queue<int> q;
	q.push(root);
	inqueue[root] = true;
	//对结点的操作
	while(!q.empty()){
		int temp = q.front();
		for(int i = 0;i < G2[temp].size();i ++){
			if(inqueue[G2[temp][i]] == false){//由于是邻接表存储,这条边必定存在,只需判定是否访问过即可 
				q.push(G2[temp][i]);
				inqueue[G2[temp][i]] = true;
			}
			q.pop();//所有下一层节点入队后,队首结点出队
		}
	} 
} 
void BFSTravel2(){
	for(int i = 0;i < n;i ++){
		if(inqueue[i] == false){
			BFS2(i);
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值