2023年7月9日发(作者:)
图的遍历——深度优先搜索和⼴度(宽度)优先搜索(含例题)专栏导读及⽬录深度优先搜索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
} f++; } for(i=1;i<=r;i++) cout<>m;//点的数量 cin>>n;//边的数量 memset(a,0,sizeof(a)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++){ cin>>v1>>v2>>h;//每条边的 起点 终点 边长 a[v1][v2]=a[v2][v1]=h;//⽆向图正反对接 } for(int i=1;i<=m;i++)if(!vis[i])bfs(i); return 0;}下⾯给出⼀些例题和代码 及时练习效果更佳
出栈次序
X星球特别讲究秩序,所有道路都是单⾏线。⼀个甲壳⾍车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前⾏。 路边有个死胡同,只能容⼀辆车通过,是临时的检查站,如图【】所⽰。
X星球太死板,要求每辆路过的车必须进⼊检查站,也可能不检查就放⾏,也可能仔细检查。 如果车辆进⼊检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种? 为了⽅便起见,假设检查站可容纳任意数量的汽车。 显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。 现在⾜⾜有16辆车啊,亲!需要你计算出可能次序的数⽬ 这是⼀个整数,请通过浏览器提交答案,不要填写任何多余的内容(⽐如说明性⽂字)。
#include
count++; return; }
if(a<=16&&b<=16&&a>=b&&k<32){
dfs(a+1,b,k+1); dfs(a,b+1,k+1); } return ;
}int main(){ dfs(1,0,1); cout< } return 0;} ⽅法⼆:⽤BFS解决#include
发布者:admin,转转请注明出处:http://www.yc00.com/news/1688897397a181914.html
评论列表(0条)