Dijkstra算法在C++语言下的实现

Dijkstra算法简介

  效果:求解单源最短路问题

  效率:O(n2)

  构图:用于保存到源点的距离的dist[], 用于记录某一个点是否已经被求解完毕的vis[],以及用于记录两点间距离的dist[][]邻接矩阵。

  思路:

    求解N遍:

      找出距源点最近的点,作为一次答案(贪心)

      利用这个点更新其他的所有未被求解的点的最短距离

  缺点:

    效率低下,存在大量不必要的操作,占用空间大;

  更好的算法:SPFA算法:O(nlgn);

 1 #include <iostream>
 2 #include <cstdio>
 3 #define MAXN 1000
 4 #define MAXINT 299999999
 5 
 6 using namespace std; 
 7 
 8 struct Grauph{
 9     int dist[MAXN+10], pre[MAXN+10];
10     bool vis[MAXN+10];
11     int A[MAXN+10][MAXN+10];
12 };
13 Grauph G;
14 int n,m;
15 
16 void init(Grauph &G,int n, int m ){
17     for(int i=0; i<=n; ++ i){
18         G.dist[i] = MAXINT;
19         G.vis[i]  = 1;
20         G.pre[i] = i;
21         for(int j=0;j<=n;++ j) G.A[i][j] = MAXINT; 
22     } 
23 }
24 void Dijkstra(Grauph &G, int s, int n){
25     G.dist[s] = 0;
26     for(int i=0; i<n; ++ i){
27         int k=0;
28         for(int j=1; j<=n; ++ j)
29             if(G.vis[j] && G.dist[j]<G.dist[k]) k = j;
30         G.vis[k] = 0;
31         for(int j=1; j<=n; ++ j)
32             if(G.vis[j] && G.dist[k]+G.A[k][j]<G.dist[j]){
33                 G.dist[j] = G.dist[k] + G.A[k][j]; 
34                 G.pre[j] = k;    
35             } 
36     }
37 }
38 void dfs(int n){
39     if(G.pre[n]==n){
40         printf("%d", n);
41         return;
42     }
43     dfs(G.pre[n]);
44     printf(" -> %d",n);
45     return;
46 }
47 int main(int argc, char** argv) {
48     scanf("%d %d", &n, &m);
49     init(G, n, m);
50     for(int i=0, x, y, w; i<m; ++i){
51         scanf("%d %d %d", &x, &y, &w);
52         if(w<G.A[x][y]){
53             G.A[x][y] = w;
54             G.A[y][x] = w;
55         }
56     }
57     int s = 1;
58     Dijkstra(G, s, n);
59     printf("length(%d -> %d) : %d \n", s, n, G.dist[n]);
60     dfs(n);
61     return 0;
62 }

 

转载于:https://www.cnblogs.com/SinTASO/p/4972763.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值