BFS广度优先搜索,小白手撕

为了简单,本程序只简单用0 1 2 3 4.....来表示顶点。

#include<iostream>
#include<queue>
#define MAX_Vertex 100
using namespace std;

//广度优先算法实现 
typedef struct Graph{
	int data[MAX_Vertex][MAX_Vertex];
	int V_num,E_num;                                     //定义定点数和边数 
}Graph;

int visited[MAX_Vertex] = {0};                                    //标识该点是否访问了 

void Init_graph(Graph *g){
	int n;
	cout << "Please input V num:\n";
	cin >> n;
	g->V_num = n;
	g->E_num = 0;
	cout << "Please input Adjacency matrix(size:Vnum * Vnum):" << endl;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n ; j++){
			cin >> g->data[i][j];
			if(g->data[i][j] != 0){
				g->E_num++;
			}
		}
	}
}
int FirstNeighbor(Graph g,int v){
	for(int i = 0; i < g.V_num; i++){
		if(g.data[v][i] != 0){
			return i;
		}
	}
	return -1;                                           
}

int NextNeighbor(Graph g,int v,int w){
	for(int i = w + 1; i < g.V_num; i++){
		if(g.data[v][i] != 0){
			return i;
		}
	}
	return -1;  
}

void BFS(Graph g,int v){
	queue<int> q;                 //辅助队列 
	q.push(v);                    //该连通分量的起点入队
	visited[v] = 1;
	while(!q.empty()){
		 v = q.front();
	     cout << v << " ";       //相当于visit(v) 
	     q.pop();
	     for(int w = FirstNeighbor(g,v);w >= 0; w = NextNeighbor(g,v,w)){
	     	  if(!visited[w]){
	     	  	   q.push(w);
	     	  	   visited[w] = 1;
	     	  }
	     }
	} 
	
}

void BFSTraverse(Graph g){
	for(int i = 0;i < g.V_num; i++){
		 visited[i] = 0;
	}
	for(int i = 0 ; i < g.V_num; i++){                //BFS执行几次,就说明有几个连通分量或强连通分量 
		if(visited[i] == 0){
			BFS(g,i);
		}
	}
}

void DFS(Graph g,int v){
	cout << v << " ";
	visited[v] = 1;
	for(int w = FirstNeighbor(g,v);w >= 0; w = NextNeighbor(g,v,w)){
		if(!visited[w]){
             DFS(g,w);			
		}
	}
}

void DFSTraverse(Graph g){
	for(int i = 0;i < g.V_num; i++){                      //将visited数组 
		 visited[i] = 0;
	}
	for(int i = 0 ; i < g.V_num; i++){                //BFS执行几次,就说明有几个连通分量或强连通分量 
		if(visited[i] == 0){
			DFS(g,i); 
		}
	}
} 


int main(){
	Graph g;
	Init_graph(&g);
	//广度优先遍历序列 
	cout << "BFS :" << endl;
	BFSTraverse(g);
	cout << endl;
	//深度优先遍历序列
	cout << "DFS:"  << endl;
	DFSTraverse(g); 
	cout << endl;
    return 0;	
}

BFS广度优先搜索算法(Breadth-First Search)是一种图的搜索算法,也是最简便的图搜索算法之一。它的目的是系统地展开并检查图中的所有节点,以找寻结果。这个算法不考虑结果的可能位置,而是彻底地搜索整张图,直到找到结果为止。广度优先搜索算法通常用于找出两个节点之间的最短路径。它可以帮助我们解决类似于寻找最短路径的问题。 BFS算法的基本思想是从起始节点开始,逐层地向外扩展,先访问离起始节点最近的节点,再逐渐向外层节点扩展,直到达到目标节点。它使用队列来存储待访问的节点,先进先出(FIFO)的特点保证了广度优先。通过不断地将节点加入队列并访问,直到队列为空,我们可以遍历整张图并找到最短路径。 BFS广度优先搜索算法的运行时间为O(V+E),其中V为顶点数,E为边数。它可以指出是否存在从起始节点到目标节点的路径,并且可以找到最短路径。当面临需要寻找最短路径的问题时,我们可以使用图来建立模型,并使用广度优先搜索算法解决问题。 参考资料: https://www.cnblogs.com/tianqizhi/p/9914539.html 文中引用的参考资料<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [代码 基于BFS广度优先搜索算法代码](https://download.csdn.net/download/s13166803785/85545057)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [广度优先搜索算法BFS)详解](https://blog.csdn.net/lemonxiaoxiao/article/details/105730735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值