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实现的更多相关文章

  1. 图的广度、深度优先遍历 C语言

    以下是老师作为数据结构课的作业的要求,没有什么实际用处和可以探讨和总结的的地方,所以简单代码直接展示. 宽度优先遍历: #include<cstdio> #include<iostr ...

  2. Python数据结构与算法之图的广度优先与深度优先搜索算法示例

    本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...

  3. 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]; ...

  4. 算法:图(Graph)的遍历、最小生成树和拓扑排序

    背景 不同的数据结构有不同的用途,像:数组.链表.队列.栈多数是用来做为基本的工具使用,二叉树多用来作为已排序元素列表的存储,B 树用在存储中,本文介绍的 Graph 多数是为了解决现实问题(说到底, ...

  5. JS 中的广度与深度优先遍历

    现在有一种类似树的数据结构,但是不存在共同的根节点 root,每一个节点的结构为 {key: 'one', value: '1', children: [...]},都包含 key 和 value,如 ...

  6. 【图数据结构的遍历】java实现广度优先和深度优先遍历

    [图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...

  7. 图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)

    主要参考资料:数据结构(C语言版)严蔚敏   ,http://blog.chinaunix.net/uid-25324849-id-2182922.html   代码测试通过. package 图的建 ...

  8. C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)

    图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息. 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用 ...

  9. Python 图_系列之基于邻接炬阵实现广度、深度优先路径搜索算法

    图是一种抽象数据结构,本质和树结构是一样的. 图与树相比较,图具有封闭性,可以把树结构看成是图结构的前生.在树结构中,如果把兄弟节点之间或子节点之间横向连接,便构建成一个图. 树适合描述从上向下的一对 ...

随机推荐

  1. Python设计模式运用

    1 面向对象 2 创建型模式 3 结构型模式 4 行为型模式

  2. CUDA[4] sample program: matrix-vector multiplication

    Use Compressed Sparse Row Format (CSR) to represent matrix #include "cuda_runtime.h" #incl ...

  3. Codeforces828 C. String Reconstruction

    C. String Reconstruction time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. 使用pyenv在系统中安装多个版本的python

    pyenv的安装与使用 如果没有安装git,首先要安装git apt-get install git 安装完成后,使用自动安装程序提供的单行程进行安装: curl -L https://github. ...

  5. 为什么需要micro-service构建平台

    最近一直在做micro-service的开发平台建设.由于这是一个实验项目,目前所有工作都得靠自己操刀. 今天在总结用python开发一个web service时,偶有所得,这让我建设micro-se ...

  6. VMware Tools安装教程

    安装依赖: sudo yum install eject 步骤: 确保 Linux 虚拟机已打开电源. 如果正在运行 GUI 界面,请打开命令 shell. 注意:以 root 用户身份登录,或使用 ...

  7. 机器学习框架之sklearn简介

    简介 今天为大家介绍的是scikit-learn.sklearn是一个Python第三方提供的非常强力的机器学习库,它包含了从数据预处理到训练模型的各个方面.在实战使用scikit-learn中可以极 ...

  8. Testing - 软件测试知识梳理 - 测试方法

    选择和使用测试方法和工具 按照测试需求用途(或测试技巧)选择 在软件开发生命周期和软件测试流程中适当地选择 按照测试人员实际技能选择 选择可提供的和可执行的 测试方法 类别及技巧 目标 使用方法 举例 ...

  9. 用O(1)的时间复杂度删除单链表中的某个节点

    给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: ...

  10. Liferay7 BPM门户开发之20: 理解Asset Framework

    Asset框架用于将您开发的门户内容添加Liferay的核心系统功能.打个比方,你开发了一个事件TodoList管理的插件,在列表显示的时候,你可以集成Asset框架,让你的自定义内容支持Tag标签. ...