問題:求圖中點1到其他各點的最短距離
策略:
1.把起點1放入初始集合Set中,從剩余的點中,選取到Set(此時Set中只有1個點)距離最近的點,並入集合Set中,
2.從剩余的點中,找經過集合Set,到起點1的最短距離,將最短邊並入Set集合
3.依次循環,直到所有的邊都並入Set

變量的命名:
Set={1,2,,,,,,x} //已找到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={start_point} => 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步選擇的點即為全局最短路
=>
命題成立!