图的遍历

您所在的位置:网站首页 遍历的基本算法有两种深度优先遍历和广度优先遍历 图的遍历

图的遍历

2024-06-30 16:31| 来源: 网络整理| 查看: 265

专栏导读及目录https://blog.csdn.net/createprogram/article/details/86741044

深度优先搜索

DFS基本思想

基本步骤:

1.从图中某个顶点v0出发,首先访问v0;  

2.访问结点v0的第一个邻接点,以这个邻接点vt作为一个新节点,访问vt所有邻接点。直到以vt出发的所有节点都被访问到,回溯到v0的下一个未被访问过的邻接点,以这个邻结点为新节点,重复上述步骤。直到图中所有与v0相通的所有节点都被访问到。

3.若此时图中仍有未被访问的结点,则另选图中的一个未被访问的顶点作为起始点。重复深度优先搜索过程,直到图中的所有节点均被访问过。

 

基本代码结构

void DFS( Point P ){ for(所有P的邻接点K){ if(K未被访问){ if(k == e) return true; 标记K; dfs(k); } } } 广度优先搜索

BFS基本思想

基本步骤:

1.从图中某个顶点v0出发,首先访问v0;

2.依次访问v0的各个未被访问的邻接点;

3.依次从上述邻接点出发,访问它们的各个未被访问的邻接点。

4.若此时图中仍有未被访问的结点,则另选图中的一个未被访问的顶点作为起始点。重复广度优先搜索过程,直到图中的所有节点均被访问过。

 

基本代码结构

通常用队列(先进先出,FIFO)实现 初始化队列Q. Q={起点s}; 标记s为己访问; while (Q非空) { 取Q队首元素u; u出队; if (u == 目标状态) {…} 所有与u相邻且未被访问的点进入队列; 标记与u相邻的点为已访问; }

DFS/BFS是竞赛中最常见的基础算法。虽然题目多种多样,但无外乎就是套用上文的程序片段,最主要的还是结合习题多练习达到熟能生巧。

这里呢,我想多讲一点。上面的BFS是使用C++库里封装的队列的,这里额外写一个不使用封装队列的方法,就是自己使用一个数组来模拟操作,见下方代码:

#include using namespace std; int a[105][105],vis[105],n,m; //a是邻接矩阵 vis是标记 点是否被访问过 void bfs(int k){ //k是当前点的名字 int q[105]; int f,r,i,j;//r表示当前BFS路过的点是第r个点 q[1]=k; vis[k]=1; f=1;r=1; while(f0 表示 i和j连通 r++; q[r]=j; vis[j]=1; } } f++; } for(i=1;iv1>>v2>>h;//每条边的 起点 终点 边长 a[v1][v2]=a[v2][v1]=h;//无向图正反对接 } for(int i=1;i{0,1},{1,-1},{-1,-1},{-1,0},{0,-1},{-1,1},{1,0},{1,1}}; typedef struct Node{ int x,y; }node; void bfs(int x,int y){ node p,t; queue


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3