Dijkstra算法正確性證明


問題:求圖中點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步選擇的點即為全局最短路
 
=>
             命題成立!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM