[PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现
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"
}
[PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现的更多相关文章
- 图的广度、深度优先遍历 C语言
以下是老师作为数据结构课的作业的要求,没有什么实际用处和可以探讨和总结的的地方,所以简单代码直接展示. 宽度优先遍历: #include<cstdio> #include<iostr ...
- Python数据结构与算法之图的广度优先与深度优先搜索算法示例
本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...
- BST和DST简单的matlab程序(图的广度和深度遍历)
图的广度和深度遍历,具体内容教材有 clc;clear all;close all; %初始化邻接压缩表compressTable=[1 2;1 3;1 4;2 4;2 5;3 6;4 6;4 7]; ...
- 算法:图(Graph)的遍历、最小生成树和拓扑排序
背景 不同的数据结构有不同的用途,像:数组.链表.队列.栈多数是用来做为基本的工具使用,二叉树多用来作为已排序元素列表的存储,B 树用在存储中,本文介绍的 Graph 多数是为了解决现实问题(说到底, ...
- JS 中的广度与深度优先遍历
现在有一种类似树的数据结构,但是不存在共同的根节点 root,每一个节点的结构为 {key: 'one', value: '1', children: [...]},都包含 key 和 value,如 ...
- 【图数据结构的遍历】java实现广度优先和深度优先遍历
[图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...
- 图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)
主要参考资料:数据结构(C语言版)严蔚敏 ,http://blog.chinaunix.net/uid-25324849-id-2182922.html 代码测试通过. package 图的建 ...
- C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息. 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用 ...
- Python 图_系列之基于邻接炬阵实现广度、深度优先路径搜索算法
图是一种抽象数据结构,本质和树结构是一样的. 图与树相比较,图具有封闭性,可以把树结构看成是图结构的前生.在树结构中,如果把兄弟节点之间或子节点之间横向连接,便构建成一个图. 树适合描述从上向下的一对 ...
随机推荐
- [ 9.28 ]CF每日一题系列—— 940A规律构造
Description: 输入a,b,x,给你a个0,b个1,你要给出一个组合,让这个组合里存在x位,使得这x为和其x+1位不相等 Solution: 因为肯定有一个正确的答案,所以钻了一下空子,贪心 ...
- 使用pyinstaller打包python小程序(没有使用第三方模块)
准备: 1,xxx.py程序文件 2,自定义的图标文件:xxx.ico 图标文件应该包含常见的多分辨率格式,以便适应在不同场合显示,不能是单一图片. 你可以用专用的软件处理生成图标,不过少量的图标生产 ...
- SDWebImage之SDWebImageCompat
SDWebImageCompat 是SDWebImage 的配置文件,里面利用条件编译对Apple 的各个平台进行了兼容.从源码中可以看到SDWebImage 支持当前的MAC/iOS/TV/WATC ...
- iostat 命令详解
前言 话说搞运维的人没有两把"刷子",都不好意思上服务器操作.还好,我还不是搞运维的,我一直都自诩是开发人员,奈何现在的东家运维人员"水"的一比,还要我这个自诩 ...
- 记一次安装VS2015后启动失败的修复过程
安装过程没有提示任何问题,然而启动vs时提示没有安装 .Net Framework 4.6,那就安装吧,但是安装 4.6 时却提示 Windows Moudle Installer 服务没有启动,于是 ...
- 利用ADO打开Access数据(64位系统)
64位的access一定要用64的程序才能正确打开,仍然用"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Test.accdb;Persist ...
- 基于ε-NFA的正则表达式引擎
正则表达式几乎每个程序员都会用到,对于这么常见的一个语言,有没有想过怎么去实现一个呢?乍一想,也许觉得困难,实际上实现一个正则表达式的引擎并没有想像中的复杂,<编译原理>一书中有一章专门讲 ...
- 牛客JS编程大题(一)
1.找出元素 item 在给定数组 arr 中的位置 function indexOf(arr,item){ return arr.indexOf(item);} 2.计算给定数组 arr 中所有元素 ...
- vue中的双向绑定
概述 今天对双向绑定感兴趣了,于是去查了下相关文章,发现有用脏检查的(angular.js),有用发布者-订阅者模式的(JQuery),也有用Object.defineProperty的(vue),其 ...
- Appium移动自动化测试入门及简单实例(python)
1.介绍 Appium是一个移动端的自动化框架,可用于测试原生应用.移动网页应用和混合型应用,且是跨平台的.可用于IOS和Android以及firefox的操作系统.原生的应用是指用android或i ...