關於最短路的幾個演算法有dijkstra,bellman-ford,floyd
dijkstra:
dijkstra適用於邊權為正的情況,從單個源點出發,到其他所有結點的最短路
演算法的核心是用已經知道的結點 i 的距離 d[i] 去更新和這個結點相連的其他結點的距離
structnode
};struct
dijkstra
void addedge(int
from,int to,int dist) //
如果是無向邊需呼叫兩次addedge
); m=edges.size();
g[from].push_back(m-1
); }
};void dijkstra(int s) //
求s到所有點的距離}}
}
其核心思想還是沒有變,依舊是用已經知道的點去更新起點s到其他點的距離,用優先佇列,優先順序最大的是距離最小的點,然後用這個點去更新其他點
最壞的情況下仍然會迴圈n-1次,但是從整體上看,每條邊恰好被檢查過一次,所以鬆弛操作的執行次數恰好是m次,這樣只用找未被訪問的d的最小值即可
可以說即使是稠密圖,用了priority_queue還是會比用鄰接矩陣的dijstra演算法快,因為不滿足d[e.to]>d[u]+e.dis是不能入隊的,所有push操作會很少
bellman-ford:
bellman-ford也是乙個求最短路的演算法,這個演算法用於算最短路的時候,如果最短路存在,那麼一定是乙個不含環的最短路,那麼這個演算法還有乙個用處就是判環,
如果存在負環的話,那麼便不會存在最短路(因為會不斷鬆弛下去)
如果不含環的話,那麼最多便通過n-1個結點(不包含起點),通過n-1「輪」鬆弛操作便可以計算出最短路
演算法核心就是通過迴圈n-1次,每次對所有的邊進行鬆弛操作邊去更新結點距離
for(int i=1;i<=n;i++)d[i]=inf;
d[0]=0
;for(int i=0;i1;i++) //
迭代n-1次
}}
這個**很明顯沒有進行負環的判定,複雜度是o(nm)
可以用fifo佇列進行優化,可以進行迴圈檢查
structedge
};vector
edges;
vector
g[maxn];
int vis[maxn]; //
判斷結點是否被訪問
int p[maxn]; //
最短路上的一條弧
int d[maxn]; //
起點s到各點的距離
bool bellman-ford(int
s) }
}return
true
; }
}
用佇列優化的bellman-ford也叫spfa(shortest path faster algorithm)
下面討論下spfa
先**這兩篇,覺得寫的不錯,以後慢慢填坑
幾個常用最短路徑演算法
今天來總結一下常用的最短路徑演算法。符號簡稱 e of edges v of vertexes single source shortest path on non weighted graph bredth first search non negative cylic graph dikstra...
最短路徑演算法 最短路
在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...
關於最短路
把最近做的幾道最短路一起總結一下吧 poj1062 中文題,不解釋題意,對於渣渣來說,是先看別人題解後才做的,以酋長的允諾作為目標點,每乙個物品與替換物之間會有一條邊,由於交換有限制,所以建完圖後,以每乙個點為終點或是說最高點,先遍歷一次,把不能交換或間接交換的點去掉,然後再進行最短路尋找。實際就是...