Dijkstra算法

最终版本

  1. vector<int> pre[maxn];
  2. void Dijkstra(int s){
  3. fill(d, d + maxn, inf);
  4. d[s] = 0
  5. for(int i = 0; i < n; i++){
  6. int u = -1, min = inf;
  7. for(int j = 0; j < n; j++){
  8. if(vis[j] == false && d[j] < min){
  9. u = j;
  10. min = d[j];
  11. }
  12. }
  13. if(u == -1) return;
  14. vis[u] = true;
  15. for(int v = 0; v < n; v++){
  16. if(vis[v] == false && G[u][v] != inf){
  17. if(G[u][v] + d[u] < d[v]){
  18. pre[v].clear();
  19. pre[v].push_back(u);
  20. d[v] = d[u] + G[u][v];
  21. } else if(d[v] == d[u] + G[u][v]){
  22. pre[v].push_back(u);
  23. }
  24. }
  25. }
  26. }
  27. }

伪代码

  1. Dijkstra(G, d[], s){
  2. for(循环n次){
  3. u = 使d[u]最小的还未访问的顶点的标号;
  4. u已经被访问;
  5. for(从u出发能到达的所有顶点v){
  6. if(v未被访问 && u为中介点使s到顶点v的最短距离d[v]最优){
  7. 优化d[v];
  8. }
  9. }
  10. }
  11. }

邻接矩阵版

  1. const int maxn = 1000;
  2. const int INF = 0x3fffffff;
  3. int n, G[maxn][maxn];
  4. int d[maxn];
  5. bool vis[maxn] = {false};
  6. void Dijkstra(int s){
  7. fill(d, d + maxn, INF);
  8. d[s] = 0;
  9. for(int i = 0; i < n;i ++){
  10. //找到未被访问中最小的d[u]
  11. int u = -1, min = INF;
  12. for(int j = 0; j < n; j++){
  13. if(vis[j] == false && d[j] < min){
  14. u = j;
  15. min = d[j];
  16. }
  17. }
  18. if(u == -1) return;//剩下的都不连通
  19. vis[u] = true;
  20. //更新距离
  21. for(int v = 0; v < n; v++){
  22. if(vis[v] == false && G[u][v] != INF && d[u] + G[u][v] < d[v]){
  23. d[v] = d[u] + G[u][v];
  24. }
  25. }
  26. }
  27. }

邻接表版

  1. struct Node{
  2. int v, dis;
  3. };
  4. vector<Node> Adj[maxn];
  5. int n;
  6. int d[maxn];//到达各点的最小路径长度
  7. bool vis[maxn] = {false};
  8. void Dijkstra(int s){
  9. fill(d, d + maxn, INF);
  10. d[s] = 0;
  11. //找距离最小的
  12. for(int i = 0; i < n; i++){
  13. int u = -1, min = INF;
  14. for(int j = 0; j < n; j++){
  15. if(vis[j] == false && d[j] < min){
  16. u = j;
  17. min = d[j];
  18. }
  19. }
  20. }
  21. if(u == -1) return;
  22. vis[u] = true;
  23. //只有这部分不同
  24. for(int j = 0; j < Adj[u].size(); j++){
  25. int v = Adj[u][j].v;
  26. if(vis[v] == false && d[u] + Adj[u][j].dis < d[v]){
  27. d[v] = d[u] + Adj[u][j];
  28. }
  29. }
  30. }