久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

PHP實(shí)現(xiàn)的迪科斯徹(Dijkstra)最短路徑算法實(shí)例

這篇文章主要介紹了PHP實(shí)現(xiàn)的迪科斯徹(Dijkstra)最短路徑算法,簡(jiǎn)單描述了迪科斯徹(Dijkstra)最短路徑算法的概念、功能并結(jié)合具體實(shí)例形式分析了php實(shí)現(xiàn)迪科斯徹(Dijkstra)最短路徑算法的相

本文實(shí)例講述了PHP實(shí)現(xiàn)的迪科斯徹(Dijkstra)最短路徑算法。分享給大家供大家參考,具體如下:

一、待解決問(wèn)題

單源最短路徑問(wèn)題,在給定有向圖中求一個(gè)頂點(diǎn)(單源頂點(diǎn))到其他所有頂點(diǎn)的最短路徑問(wèn)題。在下圖中,每條邊上有一個(gè)權(quán)值,希望求解A到所有其他頂點(diǎn)(B/C/D/E/F/G)的最短路徑。

PHP實(shí)現(xiàn)的迪科斯徹(Dijkstra)最短路徑算法實(shí)例

二、問(wèn)題分析(最短路徑的子結(jié)構(gòu)同樣最優(yōu)性)

如果P(A,G)是從頂點(diǎn)A到G的最短路徑,假設(shè)D和F是這條路徑上的中間點(diǎn),那么P(D,F)一定時(shí)從D到F的最短路徑。如果P(D,F)不是D到F的最短路徑,那必然存在某一個(gè)節(jié)點(diǎn)M的另一條D到F的路徑可以使P(A,B...M...F,G)比P(A,G)小,自相矛盾。

有了這樣的性質(zhì),我們可以了解Dijkstra算法。

三、Dijkstra算法

Dijkstra 算法,又叫迪科斯徹算法(Dijkstra),又稱(chēng)為單源最短路徑算法,所謂單源是在一個(gè)有向圖中,從一個(gè)頂點(diǎn)出發(fā),求該頂點(diǎn)至所有可到達(dá)頂點(diǎn)的最短路徑問(wèn)題。 問(wèn)題描述為設(shè)G=(V,E)是一個(gè)有向圖,V表示頂點(diǎn),E表示邊。它的每一條邊(i,j)屬于E,都有一個(gè)非負(fù)權(quán)W(I,j),在G中指定一個(gè)結(jié)點(diǎn)v0,要求把從v0到G的每一個(gè)接vj(vj屬于V)的最短有向路徑找出來(lái)(或者指出不存在)。 Dijstra算法是運(yùn)用貪心的策略,從源點(diǎn)開(kāi)始,不斷地通過(guò)相聯(lián)通的點(diǎn)找出到其他點(diǎn)的最短距離。

Dijkstra的貪心應(yīng)用在他利用(二)中的性質(zhì),不斷地選取“最近”的節(jié)點(diǎn)并試探每個(gè)節(jié)點(diǎn)的所有可能存在鏈接,以起始點(diǎn)為中心向外層層擴(kuò)展,直到擴(kuò)展到終點(diǎn)為止。對(duì)于源點(diǎn)A,逐步擴(kuò)展,根據(jù)dist[j]=min{dist[j],dist[i]+matrix[i][j]}更新與i直接相鄰的頂點(diǎn)信息。

算法描述

1)算法思想:

設(shè)G=(V,E)是一個(gè)帶權(quán)有向圖,把圖中頂點(diǎn)集合V分成兩組,第一組為已求出最短路徑的頂點(diǎn)集合(用S表示,初始時(shí)S中只有一個(gè)源點(diǎn),以后每求得一條最短路徑 , 就將加入到集合S中,直到全部頂點(diǎn)都加入到S中,算法就結(jié)束了),第二組為其余未確定最短路徑的頂點(diǎn)集合(用U表示),按最短路徑長(zhǎng)度的遞增次序依次把第二組的頂點(diǎn)加入S中。在加入的過(guò)程中,總保持從源點(diǎn)v到S中各頂點(diǎn)的最短路徑長(zhǎng)度不大于從源點(diǎn)v到U中任何頂點(diǎn)的最短路徑長(zhǎng)度。此外,每個(gè)頂點(diǎn)對(duì)應(yīng)一個(gè)距離,S中的頂點(diǎn)的距離就是從v到此頂點(diǎn)的最短路徑長(zhǎng)度,U中的頂點(diǎn)的距離,是從v到此頂點(diǎn)只包括S中的頂點(diǎn)為中間頂點(diǎn)的當(dāng)前最短路徑長(zhǎng)度。

2)算法步驟:

a.初始時(shí),S只包含源點(diǎn),即S={v},v的距離為0。U包含除v外的其他頂點(diǎn),即:U={其余頂點(diǎn)},若v與U中頂點(diǎn)u有邊,則<u,v>正常有權(quán)值,若u不是v的出邊鄰接點(diǎn),則<u,v>權(quán)值為∞。

b.從U中選取一個(gè)距離v最小的頂點(diǎn)k,把k,加入S中(該選定的距離就是v到k的最短路徑長(zhǎng)度)。

c.以k為新考慮的中間點(diǎn),修改U中與k相鄰的各頂點(diǎn)的距離;若從源點(diǎn)v到頂點(diǎn)u的距離(經(jīng)過(guò)頂點(diǎn)k)比原來(lái)距離(不經(jīng)過(guò)頂點(diǎn)k)短,則修改頂點(diǎn)u的距離值,修改后的距離值為頂點(diǎn)k的距離加上k與u邊上的權(quán)。

d.重復(fù)步驟b和c直到所有頂點(diǎn)都包含在S中。

四、算法PHP實(shí)現(xiàn)

<?php
class Dijkstra
{
  private $G;
  public function __construct()
  {
    //有向圖存儲(chǔ)
    $this->G = array(
      array(0,1,2,0,0,0,0),
      array(0,0,0,1,2,0,0),
      array(0,0,0,0,0,2,0),
      array(0,0,0,0,0,1,3),
      array(0,0,0,0,0,0,3),
      array(0,0,0,0,0,0,1),
      array(0,0,0,0,0,0,0),
    );
  }
  public function calculate()
  {
    // 存儲(chǔ)已經(jīng)選擇節(jié)點(diǎn)和剩余節(jié)點(diǎn)
    $U = array(0);
    $V = array(1,2,3,4,5,6);
    // 存儲(chǔ)路徑上節(jié)點(diǎn)距離源點(diǎn)的最小距離
    $d = array();
    //初始化圖中節(jié)點(diǎn)與源點(diǎn)0的最小距離
    for($i=1;$i<7;$i++)
    {
      if($this->G[0][$i]>0)
      {
        $d[$i] = $this->G[0][$i];
      }
      else
      {
        $d[$i] = 1000000;
      }
    }
    // n-1次循環(huán)完成轉(zhuǎn)移節(jié)點(diǎn)任務(wù)
    for($l=0;$l<6;$l++)
    {
      // 查找剩余節(jié)點(diǎn)中距離源點(diǎn)最近的節(jié)點(diǎn)v
      $current_min = 100000;
      $current_min_v = 0;
      foreach($V as $k=>$v)
      {
        if($d[$v] < $current_min)
        {
          $current_min = $d[$v];
          $current_min_v = $v;
        }
      }
      //從V中更新頂點(diǎn)到U中
      array_push($U,$current_min_v);
      array_splice($V,array_search($current_min_v,$V),1);
      //更新
      foreach($V as $k=>$u)
      {
        if($this->G[$current_min_v][$u]!=0&&$d[$u]>$d[$current_min_v]+$this->G[$current_min_v][$u])
        {
          $d[$u] = $d[$current_min_v]+$this->G[$current_min_v][$u];
        }
      }
    }
    foreach($d as $k => $u)
    {
      echo $k.'=>'.$u.'<br>';
    }
  }
}
?>

調(diào)用類(lèi):

$D = new Dijkstra;
$D->calculate();

執(zhí)行結(jié)果:

1=>1
2=>2
3=>2
4=>3
5=>3
6=>4

【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過(guò)測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡(jiǎn)單分析了插值查找算法的概念、原理并結(jié)合實(shí)例形式分析了php實(shí)現(xiàn)針對(duì)有序表插值查找的相關(guān)操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實(shí)現(xiàn)服務(wù)端分頁(yè)的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
下面小編就為大家分享一篇PHP實(shí)現(xiàn)APP微信支付的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
這篇文章主要介紹了PHP實(shí)現(xiàn)的多維數(shù)組排序算法,結(jié)合實(shí)例形式對(duì)比分析了php針對(duì)多維數(shù)組及帶有鍵名的多維數(shù)組進(jìn)行排序相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
這篇文章主要為大家詳細(xì)介紹了php結(jié)合ajaxuploadfile實(shí)現(xiàn)無(wú)刷新文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細(xì)介紹了PHP開(kāi)發(fā)接口使用RSA進(jìn)行加密解密方法,對(duì)此有興趣的朋友可以學(xué)習(xí)下。
主站蜘蛛池模板: 人人99 | 国产精品久久久久一区二区三区 | 精品久久国产 | 中文字幕视频在线 | 国产福利视频在线观看 | 日韩精品免费 | 国产亚洲一区二区三区在线 | 毛片a级 | 亚洲精品2 | 精品久久久久久久久久久久久久 | 亚洲国产欧美日韩 | 免费黄色a级毛片 | 一级片在线视频 | 国产视频观看 | 亚洲精品乱码久久久久久久久 | 日韩免费视频一区二区 | 亚洲一区国产精品 | 成人在线视频一区二区三区 | 久久精品视频网站 | 九色在线视频 | 国产乱码久久久久久一区二区 | 日韩区 | 一级黄色夫妻生活 | 成人亚洲精品久久久久软件 | 在线不卡视频 | 黄色一级片视频 | 自拍偷拍精品 | 日韩激情在线 | 成人二区| 亚洲逼院 | 国产伦精品一区二区三区精品视频 | 国产在线不卡 | 欧美激情在线一区二区三区 | 国产综合精品一区二区三区 | 色偷偷噜噜噜亚洲男人 | 亚洲视频在线一区 | 青青草综合网 | 亚洲午夜av久久乱码 | 成人精品视频 | 亚洲一区不卡在线 | 精品视频导航 |