首頁 >後端開發 >php教程 >php如何實現鄰接矩陣圖的廣度和深度優先遍歷(程式碼)

php如何實現鄰接矩陣圖的廣度和深度優先遍歷(程式碼)

不言
不言轉載
2018-09-28 15:47:293134瀏覽

這篇文章帶給大家的內容是關於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中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除