[PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现
程序员文章站
2022-06-22 11:27:01
1.图的深度优先遍历类似前序遍历,图的广度优先类似树的层序遍历 2.将图进行变形,根据顶点和边的关系进行层次划分,使用队列来进行遍历 3.广度优先遍历的关键点是使用一个队列来把当前结点的所有下一级关联点存进去,依次进行 邻接矩阵的广度优先遍历: BFS(G) for i=0;inumVertexes... ......
1.图的深度优先遍历类似前序遍历,图的广度优先类似树的层序遍历 2.将图进行变形,根据顶点和边的关系进行层次划分,使用队列来进行遍历 3.广度优先遍历的关键点是使用一个队列来把当前结点的所有下一级关联点存进去,依次进行 邻接矩阵的广度优先遍历: bfs(g) for i=0;i<g->numvertexes;i++ visited[i]=false;//检测是否访问过 for i=0;i<g.numvertexes;i++//遍历顶点 if visited[i]==true break;//访问过的断掉 visited[i]=true //当前顶点访问 inqueue(i) //当前顶点入队列 while(!queueempty()) //当前队列不为空 i=outqueue() //队列元素出队列 for j=0;j<g->numvertexes;j++ //遍历顶点 if g->arc[i][j]==1 && !visited[j] //当前顶点与其他顶点存在关系并且未被访问 visited[j]=true //标记此顶点 inqueue(j) //此顶点入队列,会排在后面等前面一层的全遍历完才会遍历这个 深度优先遍历dfs: dfstravserse g for i=0;i<g.xnum;i++ if !visted[i] dfs(g,i) dfs g,i visted[i]=true print g.vexs[i] if g.arc[i][j]==1 && !visited[j] dfs(g,j) 图的物理存储的实现: 邻接矩阵 邻接链表 十字链表 邻接多重表 有向图的存储方法:十字链表 无向图存储的优化:邻接多重表 图的遍历: 1.从图中某一顶点出发访遍图中其余顶点,且使每个顶点仅被访问一次 2.需要给访问过的顶点打上标记,设置个数组visited[n],访问过后设置为1 3.遍历次序:深度优先遍历和广度优先遍历 深度优先遍历dfs: 1.类似走迷宫右手定则,走一个做标记,一直往右走,直到重复了,就退回上一个顶点 2.从某个顶点v出发访问和v有路径相通的顶点,递归调用
<?php class graph{ public $vertexs; public $arc; public $num=5; } $g=new graph(); for($i=0;$i<$g->num;$i++){ $g->vertexs[$i]="v{$i}"; } $g->arc[1][0]=9; $g->arc[1][2]=3; $g->arc[2][0]=2; $g->arc[2][3]=5; $g->arc[3][4]=1; $g->arc[0][4]=6; //广度优先遍历 function bfs($g){ $res=array(); $queue=array(); for($i=0;$i<$g->num;$i++){ $visited[$i]=false; } for($i=0;$i<$g->num;$i++){ if($visited[$i]){ break; } $visited[$i]=true; $res[]=$g->vertexs[$i]; array_push($queue,$i); while(!empty($queue)){ $v=array_pop($queue); for($j=0;$j<$g->num;$j++){ if($g->arc[$v][$j]>0 && !$visited[$j]){ $visited[$j]=true; $res[]=$g->vertexs[$j]; array_push($queue,$j); } } } } return $res; } //深度优先遍历 function dfs($g,$i){ static $res; static $visited; if(!$visited[$i]){ $visited[$i]=true; $res[]=$g->vertexs[$i]; } for($j=0;$j<$g->num;$j++){ if($g->arc[$i][$j]>0 && !$visited[$j]){ $visited[$j]=true; $res[]=$g->vertexs[$j]; dfs($g,$j); } } return $res; } $b=bfs($g); $d=dfs($g,1); var_dump($b); var_dump($d);
array(5) { [0]=> string(2) "v0" [1]=> string(2) "v4" [2]=> string(2) "v1" [3]=> string(2) "v2" [4]=> string(2) "v3" } array(5) { [0]=> string(2) "v1" [1]=> string(2) "v0" [2]=> string(2) "v4" [3]=> string(2) "v2" [4]=> string(2) "v3" }
上一篇: 老公我也不要了,你把孩子还给我好吗
推荐阅读
-
Java实现二叉树的深度优先遍历和广度优先遍历算法示例
-
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
-
[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现
-
PHP实现二叉树的深度优先与广度优先遍历方法
-
Java数据结构与算法:图、图的概念、深度优先搜索DFS、广度优先搜索BFS、思路分析、代码实现
-
数据结构与算法————图的遍历DFS深度优先搜索和BFS广度优先搜索
-
JavaScript实现树的遍历算法示例【广度优先与深度优先】
-
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
-
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
-
图的遍历---广度优先遍历和深度优先遍历