[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 Gfor i=0;i<G.xNum;i++if !visted[i]DFS(G,i) DFS G,ivisted[i]=trueprint 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语言,图的广度、深度优先遍历 C语言
以下是老师作为数据结构课的作业的要求,没有什么实际用处和可以探讨和总结的的地方,所以简单代码直接展示. 宽度优先遍历: #include #include #include using namespa ...
- 邻接矩阵的存储方式实现图的广度和深度优先遍历
在做图的邻接矩阵之前,先做好准备工作,定义存储类型,声明队列的操作(在广度优先遍历中使用) #include <stdio.h> #include <stdlib.h> #in ...
- C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)
上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...
- 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历
简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...
- 算法:图(Graph)的遍历、最小生成树和拓扑排序
背景 不同的数据结构有不同的用途,像:数组.链表.队列.栈多数是用来做为基本的工具使用,二叉树多用来作为已排序元素列表的存储,B 树用在存储中,本文介绍的 Graph 多数是为了解决现实问题(说到底, ...
- 图的顺序存储及其深度优先遍历和广度优先遍历
图的基本概念 在线性表中,数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继.在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素 ...
- 【图】广度与深度遍历
图的常用操作 FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号.若x没有邻接点或图中不存在x,则返回-1. NextNeighbor(G,x,y):假设图G中顶点y ...
- C/C++实现图的广度和深度遍历
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> # ...
- 图、邻接矩阵、广度与深度优先、生成树
最近突然被问到这个问题,于是复习一下,用最通俗的语言解释. 图 无向图:如下左图各个顶点之间用不带箭头的边连接的图:相应的右图就是有向图 邻接矩阵 可以理解为表示上述图 ...
最新文章
- dis的前缀单词有哪些_玩转英语词汇--词汇积累策略之前缀dis
- SAP WM Interview Questions
- python百度云资源-python学习资源--百度云
- 微服务实践分享(2)api网关
- Oracle EBS-SQL (PO-13):检查采购物料无一揽子协议价格.sql
- GoldenGate的ADD SCHEMATRANDATA命令研究
- ntdll.dll和ntoskrnl.exe中的NT*和ZW*函数区别
- java显示一个钟表_中秋团圆日,月相表来一个呗~
- 【youcans 的 OpenCV 例程200篇】114. 形态学操作之膨胀
- JS实现透明度渐变动画
- PHP中return的用法
- c语言 python java_C语言、C++、Java,Python之间的区别,哪个更有前景,哪个更难 ?...
- 函数指针和指针函数(回调函数)
- 基于选项模式实现.NET Core的配置热更新
- 利用PhantomJS进行网页截屏,完美解决截取高度的问题
- linux 查看内存条详情命令
- ar面部识别_人脸识别、AR
- 计算机编程php网页源码水果网上销售系统mysql数据库web结构html布局
- python代码翻译器-Python实现翻译软件
- SAP补提折旧-折旧的增加/减少
热门文章
- gaia引擎分析(一)资源管理
- Crontab- Linux必学的60个命令
- js将数组中一个或多个字段相同的子元素中合并
- json对象与字符串互转
- mp4 视频在网页上播放不了
- Can't use Subversion command line client:svn
- 【Objective-C学习记录】第一天
- Ubuntu 14.10安装SecureCRT 7.3
- 从配置文件(*.config)读到内存中,手动修改配置文件后,内存中数据改变问题.
- centos cron 自动执行脚本异常 命令不生效的解决办法