問題:求圖中點1到其他各點的最短距離
策略:1.把起點1放入初始集合set中,從剩餘的點中,選取到set(此時set中只有1個點)距離最近的點,併入集合set中,
2.從剩餘的點中,找經過集合set,到起點1的最短距離,將最短邊併入set集合
3.依次迴圈,直到所有的邊都併入set
變數的命名:
set= //已找到start(本例中是1點)到1,2,,,,,x的最短路徑的點的集合set
dist[u]: //從start點開始,經過set中的點,到u點的最短距離
short[u]: //從start開始到u的全域性最短路徑(不一定經過set中的點)
可知short[u] <= dist[u]
證明過程:
命題:演算法進行到第k步時,set中的每個節點set_i的dist[set_i]等於全域性最短路徑short[set_i]
(第n步時,dist[n]=short[n],此時找到點1到所有點的最短距離)
歸納基礎:
k=1,set= => dist[start_point] == short[start_point] ==0,命題正確
歸納假設:
第k步成立,則第k+1步成立
設k+1步選擇了頂點v(v是剩餘集合中,經過set到start_point距離最近的點)
該頂點與set中的u點相連, 欲證dist[v] == short[v]
反證法:假設命題不正確,即:存在start_point到點v的更短路徑 l(綠色部分)為最短路徑short[v],
該路徑經過集合中的最後乙個點為last_point,經過未收錄集合的點集 uncollected_point_set中的,任1個或者多個點到達v.
本例以單點y為例,多點同理:(v和last_point不可能直接相連,若直接相連,因為dist[v]最後一點經過u,且為最短,此時l必然》=dist[v],不是更短路徑)
此時 l == dist[y] + distance[y, v] == short[v]
由題意知,dist[v] <= dist[y]
=>
dist[v] <= l == short[v]
dist[v]是相對於l更短的路徑=>假設不成立,不存在更短的路徑l為全域性最短路徑,第k+1步選擇的點即為全域性最短路
=>
命題成立!
Dijkstra演算法正確性證明
問題 求圖中點1到其他各點的最短距離 演算法描述 設初始時圖的所有點的集合u 把起點s放入初始集合set中 u u set set 找s經過集合set中的點,能達到的距離最短的點k k in u 將k併入set 言外之意k的前乙個點必然屬於set u u set set 由於每次引入的只有乙個點k,...
貪心演算法正確性證明
貪心演算法正確性證明 wiki定義 貪心演算法 英語 greedy algorithm 又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有利 的選擇,從而希望導致結果是最好或最優的演算法。比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心演算法。用大白話說...
Kruskal演算法的正確性證明
1 演算法說明 輸入圖g v,e,w v 輸出圖g的最小生成樹t 設計思想 按照長度從小到大對邊排序 依次考察當前最短邊e,如果e與t的邊不構成迴路,則把e加入樹t,否則跳過e直到選擇了n 1條邊為止。2 證明思路 命題 對於任意n,演算法對n階圖找到一棵最小生成樹 歸納基礎 證明n 2時演算法正確...