DFS和BFS

#include<iostream>
#include<queue>
using namespace std;

#define MAX 100

class MGraph
{
private:
	int num_vertex;//顶点数目
	char array_vertex[MAX];//顶点的集合
	bool visited[MAX];//顶点访问标志
	int matrix_graph[MAX][MAX];//邻接矩阵
public:
	//MGraph();
	MGraph(int num_v,char *array_v,int (*matrix)[MAX]);
	//~MGraph();
	void BFS();//广度优先搜索
	void DFS();//深度优先搜索
	void SUB_DFS(int order);//深度优先搜索递归程序
};

MGraph::MGraph(int num_v,char *array_v,int (*matrix)[MAX])
{
	num_vertex = num_v;
	for(int i = 0;array_v[i]!='\0';i++)
		array_vertex[i] = array_v[i];
	for(int i = 0;i<num_v;i++)
	{
		for(int j = 0;j<num_v;j++)
		{
			matrix_graph[i][j] = matrix[i][j];
		}
	}
}

void MGraph::DFS()
{
	//初始化所有节点状态为未访问
	for(int i = 0;i<num_vertex;++i)
		visited[i] = false;
	//深度遍历各个顶点
	for(int i = 0;i<num_vertex;++i)
		if(!visited[i])
			SUB_DFS(i);
}

void MGraph::SUB_DFS(int order)
{
	cout<<array_vertex[order]<<" ";
	visited[order] = true;
	//查看与其相连的下一个邻接点
	for(int i = 0;i<num_vertex;++i)
		if(matrix_graph[order][i] == 1 && !visited[i])
			SUB_DFS(i);
}

void MGraph::BFS()
{
	for(int i = 0;i<num_vertex;++i)
		visited[i] = false;
	queue<int> que;
	for(int i = 0;i<num_vertex;++i)//对每个节点做循环
	{
		if(!visited[i])
		{
			visited[i] = true;
			cout<<array_vertex[i]<<" ";//输出该节点
			que.push(i);//将该节点入队列
			while(!que.empty())
			{
				int order = que.front();//队首元素
				que.pop();
				for(int j = 0;j<num_vertex;++j)
				{
					//判断其他顶点若与当前节点存在边且未访问
					if(matrix_graph[order][j] == 1 && !visited[j])
					{
						visited[j] = true;
						cout<<array_vertex[j]<<" ";
						que.push(j);
					}
				}
			}
		}
	}
	cout<<endl;
}


int main()
{
	int num_v = 0;
	char array_v[MAX] = {0};
	cout<<"请输入顶点数目:";
	cin>>num_v;
	cout<<"请输入顶点的集合:";
	char ch;
	while(cin>>ch)
	{
		static int num = 0;
		if(!((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')))
			break;
		array_v[num++] = ch;
	}
	cout<<"请输入邻接矩阵:"<<endl;
	int matrix_g[MAX][MAX];
	for(int i = 0;i<num_v;i++)
	{
		for(int j = 0;j<num_v;j++)
		{
			cin>>matrix_g[i][j];
		}
	}
	MGraph G(num_v,array_v,matrix_g);
	cout<<"深度优先搜索:";
	G.DFS();
	cout<<endl;
	cout<<"广度优先搜索:";
	G.BFS();
	return 0;
}
//测试用例
/*
Martix Graph:
0 0 1 1 0 1 0
0 0 1 0 0 0 0
1 1 0 1 0 0 0
1 0 1 0 0 0 0
0 0 0 0 0 0 1
1 0 0 0 0 0 1
0 0 0 0 1 1 0
DFS: A C B D F G E
BFS: A C D F B G E
*/

### 深度优先搜索DFS)与广度优先搜索BFS)的区别 #### 访问节点顺序 深度优先搜索DFS)倾向于尽可能深入地探索子节点,直到无法继续为止才回溯到上一层级并尝试其他分支。与此相反,广度优先搜索BFS)会逐层扩展邻居节点,在完全处理完当前层次之前不会进入下一层。 #### 使用的数据结构 为了实现这种不同的遍历方式,DFS通常采用栈来保存待访问的顶点列表;而BFS则依赖队列这一先进先出(FIFO)的数据结构来进行操作[^1]。 #### 应用场景分析 ##### DFS适用情况 当目标是最短路径之外的信息或者需要找到所有可能解时,比如求连通分量、拓扑排序等问题中,DFS往往更加高效。此外,对于那些具有明显递归性质的任务来说,利用函数调用隐式的维护了一个系统堆栈,使得编写起来更为简洁直观[^2]。 ##### BFS适用情况 如果问题是关于寻找最短距离或最少转换次数之类的,则应考虑使用BFS。因为按照层级依次展开的方式能够保证最先到达终点的就是最优方案之一。例如在网络路由协议里计算两台主机间的最小跳数等场合就非常适合运用此方法[^3]。 ```python from collections import deque def bfs(graph, start): visited = set() queue = deque([start]) while queue: vertex = queue.popleft() if vertex not in visited: print(vertex) visited.add(vertex) for neighbor in graph[vertex]: if neighbor not in visited: queue.append(neighbor) def dfs(graph, start, visited=None): if visited is None: visited = set() stack = [start] while stack: s = stack.pop() if s not in visited: print(s) visited.add(s) for neighbour in reversed(graph[s]): if neighbour not in visited: stack.append(neighbour) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值