目录
一.Dijkstra
1.思想
想必Dijkstra的思想大家都知道吧,就是单源点最短路径。
2.禁区
注意,Dijkstra不能处理负权边,因为一旦它遇上负权边就会出现如下情况:
Dijkstra的算法会先从2和3号点中选择出最近的2号点进行松弛,因而把2号点就标记了,当第三次松弛三号点的时候就不能走2号点,从而就错过了最短路,有点像贪心。Dijkstra给出的最短路是从1号点走到2号点,再到三号点,从而最短路径是15,然而真实的最短路径是12。
二.朴素Dijkstra
直接上代码:
for (int i = 1; i <= n; i ++)//G数组就是图,是邻接矩阵
dis[i] = G[s][i];//初始化
head[s] = s;
vis[s] = 1;
dis[s] = 0;
for (int i = 1; i < n; i ++){
int k = 0, smin = INF;
for (int j = 1; j <= n; j ++)
if (!vis[j] && dis[j] < smin){
smin = dis[j];
k = j;
}
if (!k)
break;
vis[k] = 1;
for (int j = 1; j <= n; j ++){
if (dis[j] > dis[k] + G[k][j]){
dis[j] = dis[k] + G[k][j];