日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

迪杰斯特拉算法(Dijkstra)证明

發布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迪杰斯特拉算法(Dijkstra)证明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先,這篇文章是在講《圖論》時候寫文章

(所以,還是以理論為主,以后有空的時候,會把代碼發上來,不過我覺得大家看完理論,如果講得好,代碼也就比較容易了。如果講得不好,網上的代碼也是大把,不看這篇文章也罷了)


任務目標:

給個起點S,找到圖中每個點距離起點S的最小距離(考慮聯通性的問題)。


算法思路概述

先選第一個距離S最近的點。之后,更新其他圖中的點到S的距離。更新原因:新增加的最近點可以作為一個橋。

  • 輸入是:點之間的距離矩陣。
  • 維護是:上面矩陣中的某一行

下圖為老師的課件內容部分,我覺得雖然詳盡,但也有些枯燥。可能是為了凝練語言吧。如果有耐心看的話,倒真的是一篇非常好的文章。
我在后面會用自己的語言闡述,可能會比較清晰(但廢話可能也比較多)。

其中前面的黃色部分是我自己標注的(老師寫的),后面的黃色部分是我自己寫的。



闡述

  • 首先,選定一個點v0v0v0,先假設所有的點到某個點的路徑都是無窮(當然自己到自己肯定得是長度是0…)。
  • 然后確定一個集合SSS,這集合表示已經被訪問的過點。(那么沒有被訪問過的點,也是很容易解決的…),這里用個bool數組什么的標記一下吧。
  • 之后,先更新所有點到這個v0v0v0的距離。怎么更新呢?
  • 所有點通過已經被訪問過的點到達v0v0v0的距離,在結合d(v0,vi)=minvj∈(S)(d(v0,vj)+w(vj,vi))d(v0, vi) = min_{vj \in (S)}(d(v0, vj) + w(vj, vi))d(v0,vi)=minvj(S)?(d(v0,vj)+w(vj,vi)) ( 一般就是新增加的那個點考慮下就好了 )。就是在中間搭一個橋,如果,通過這個橋的點會讓這個路變得更近,就更新這個路徑的長度。
  • 然后選個最近的點,然后把這個最近的點標記訪問過。納入到集合SSS
  • 然后,一直到把所有的點都納入進去之后,就沒什么事情了~
  • 這里面,有很多的問題,乍一看都是有點合情合理,但是卻讓人一下子想不明白的。
    歸結到一條,就是,為什么這樣子,就能保證一定會是得到了所有的點,到這個點v0v0v0的最短距離呢?


    證明(不嚴格的證明)

  • 首先,我們能保證,拿到的第一個點,一定是跟v0v0v0最近的點。 因為,首先我們選擇的是與v0v0v0直接相連的點中到v0v0v0最近的點。如果之后的選的方法得到點,有能夠得到的點到v0v0v0的距離小于一開始選的這個點的話,這是不科學的。因為,我們每次選點,都是根據我們維護的一個數組。這個數組的變化過程是,以這個數組中很早就被選中的點的為中轉的點,然后,再加上這個中轉的點到這個的點的距離,來替代的。但是,我們知道,任意兩點的距離都是大于0的,那么,更新的基本算法是“加法”那么更新之后, 怎么可能得到的數是比之前的數要小呢?
  • 同樣的道理,第二次被選的點,一定是比以后要選的點都要更近v0v0v0一點。(最多是相等)。有沒有一種感覺,就跟堆排序的方法是一樣的。每次,都是把距離v0v0v0最近的點給“生產”出來了。然后不斷迭代出所有與v0的點更近的點。

  • 證明(較為嚴格的證明)

    通過歸納法

    (1) i=0i = 0i=0
    首先,還是一樣,根據上面的方式,來依次產生出這些點。這是一個序列,稱其為V=v0,v1,v2,....,vnV= {v0, v1, v2, ....,vn}V=v0,v1,v2,....,vn這n個點。vivivi對應的距離就是dididi

    (2) 設i<=ki <= ki<=k時成立,下面看 i=k+1i = k + 1i=k+1的情況

    vivivi通過上述方法生成的點,所得到的到v0v0v0的距離不是最近的,也就是說,還存在一條路,使得viviviv0v0v0的距離小于dididi
    由于,dididi的產生方法,我們可以知道,這樣的點,必定通過了后面的點(vi>=k+2v_{i >= k + 2}vi>=k+2?)。但是,我們同樣知道vi>=k+2v_{i >= k + 2}vi>=k+2?v0v0v0的距離一定是會大于vi<=kv_{i <= k }vi<=k?的。(遞增的特點)。所以,只要是通過了后面的點,到達v0v0v0的距離,一定是大于等于,我們只通過前面的點vi<=kv_{i <= k }vi<=k?到達所致的。但是,這與我們之前的假設有矛盾。這樣我們就知道了, i=k+1i = k + 1i=k+1時候也是成立的!

    綜上所述…

    總結

    以上是生活随笔為你收集整理的迪杰斯特拉算法(Dijkstra)证明的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。