Dijkstra(迪傑斯特拉) 單源最短路

2021-08-21 07:12:25 字數 1531 閱讀 4349

在圖中,我們可以指定乙個點為起點,計算它到其餘各點的最短路徑。我們尋找乙個與它之間最近的點,以此為基礎不斷的更新它經過此點到其他點的最短路,並重複這個過程,直到所有的點都被尋找一遍。

#include#include#includeusing namespace std;

const int maxn = 100;

const int inf = 0x3f3f3f3f;

int map[maxn][maxn];

int dis[maxn];

bool vis[maxn];

int n, m;

void dijkstra()

} vis[k] = true;

for(int i = 1; i <= n; i++)

if(dis[i] > dis[k] + map[k][i])

dis[i] = dis[k] + map[k][i];

} return ;

}int main()

for(int i = 1; i <= n; i++)

dis[i] = map[1][i];

memset(vis, false, sizeof(vis));

vis[1] = true;

dijkstra();

for(int i = 1; i <= n; i++)

printf("%d ", dis[i]);

printf("\n");

} return 0;

}

加乙個小條件

在進行鬆弛(就是更新dis陣列)是,判斷一下從i 到k的值是否小於inf,在計算上沒什麼用,是用來判算i到k的2路是否存在.....

#include#include#includeusing namespace std;

const int maxn = 100;

const int inf = 0x3f3f3f3f;

int map[maxn][maxn];

int dis[maxn];

bool vis[maxn];

int n, m;

void dijkstra()

} vis[k] = true;

for(int i = 1; i <= n; i++)

}return ;

}int main()

for(int i = 1; i <= n; i++)

dis[i] = map[1][i];

memset(vis, false, sizeof(vis));

vis[1] = true;

dijkstra();

for(int i = 1; i <= n; i++)

printf("%d ", dis[i]);

printf("\n");

} return 0;

}

可以根據需要適當修改細節

注意  : dijkstra無法處理負權邊,接下來要用bellman-ford!!!!!!

迪傑斯特拉 Dijkstra

參考 迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。大概就是這樣乙個有權圖,dijkstra演算法可以計算任意節點到其他節點的最短路徑 演算法思路 指定乙個節點,...

Dijkstra 迪傑斯特拉

1 演算法思想 設g v,e 是乙個帶權有向圖,把圖中頂點集合v分成兩組 第一組為已求出最短路徑的頂點集合 用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 就將加入到 集合s中,直到全部頂點都加入到s中,演算法就結束了 第二組為其餘未確定最短路徑的頂點集合 用u表示 按最短路徑長度的遞增次...

Dijkstra(迪傑斯特拉)演算法

迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。指定乙個節點,例如我們要計算 a 到其他節點的最短路徑 引入兩個集合 s u s集合包含已求出的最短路徑的點 以及相...