关闭

单源最短路径 dijkstra算法实现

标签: 单源最短路径dijkstra
1360人阅读 评论(0) 收藏 举报
分类:

  本文记录一下dijkstra算法的实现,图用邻接矩阵表示,假设图为无向图,并且连通,有向图,不连通图的做法类似。

算法简述:

  1. 首先确定“单源”的源,假设是第0个顶点。

  2. 维护三个数组dist[], color[], path[],设其下标分别为0…i…n-1:
      dist[] 表示源点到顶点i的最短距离,在初始化时,如果源点到顶点i有路径,则初始化为路径的权重,否则初始化为INT_MAX;
      color[] 数组其实表示两个集合,即color[i]值为1的集合表示已经确定最短路径的点的集合,color[i]值为0表示没有确定最短路径的点的集合。初始化为将源点的color设置为1,其余点设置为0;
      path[]数组存储到顶点i的路径,如果path[i]=3,path[3]=2,paht[2]=0,则这条最短路径是0->2->3->i,与数组给出的顺序是逆序。

  3. 依次从dist[]数组中选一个最小的dist值,假设顶点的坐标为index,这个dist值即为最终确定的最短距离的点,更新这个点的color值为1,下面一个操作是dijkstra算法的重点,也只有这么一个重点操作,即:在没有确定最短距离的集合中(即color值为0的点的集合),如果源点到index的距离,加上index到这些点的距离小于原来的dist值,则更新dist值,同时更新path值。

  4. 重复第3个操作,直到color值为0的集合为空。

下面给出c语言实现代码,方法都出了注释,这里不再说明, 如果不足之处请提出(使用的默认的图如下):
这里写图片描述

#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

int n;
int source = 0;     //求从第0个节点到其他节点的最短路径
int* dist;
int* path;
int* color;     //颜色为1说明已经找到最短路径,为-1说明没找到最短路径

//获得默认的图,即上图所示,使用邻接矩阵表示
int** get_graph(){
    int** matrix;
    int i,j;
    int start,end,weight;

    printf("input vertex num:\n");
    scanf("%d",&n);

    matrix = (int**)malloc(sizeof(int*)*n);

    for(i=0;i<n;i++){
        matrix[i] = (int*)malloc(sizeof(int)*n);
        for(j=0;j<n;j++){
            if(i!=j)
                matrix[i][j] = INT_MAX;
            else
                matrix[i][j] = 0;
        }
    }

    printf("input start end weight, stop by -1\n");

    for(;;){
        scanf("%d",&start);  
        if(start==-1){  
            break;  
        }  
        scanf("%d %d",&end,&weight); 
        matrix[start][end] = weight;
        matrix[end][start] = weight;
    }
    return matrix;
}

//使用迪杰斯特拉算法求单源最短路径
void single_source_shortest_path(int** matrix,int source){

    int i,j,index,min;

    dist = (int*)malloc(sizeof(int)*n);
    color = (int*)malloc(sizeof(int)*n);
    path = (int*)malloc(sizeof(int)*n);

    //初始化最短路径:
    //直接相连的初始化为权重,不直接相连的初始化为INT_MAX
    for(i=0;i<n;i++){
        dist[i] = matrix[source][i];
        color[i] = 0;
        if(i!=source && dist[i]!=INT_MAX){
            path[i] = source;
        }else{
            path[i] = -1;
        }
    }

    color[source] = 1;
    path[source] = 0;

    //找一个从源点到其他节点最短的路径
    for(j=0;j<n;j++){
        min = INT_MAX;
        index = -1;
        for(i=0;i<n;i++){
            if(!color[i] && dist[i]<min){
                index = i;
                min = dist[i];
            }
        }

        if(index==-1){  //所有定点的最终距离都确定
            break;
        }

        color[index] = 1;   //标记为已经确定最短距离的定点

        //接下来更新到每个未确定最短距离的定点的距离
        //如果源点到刚刚添加的节点的最短距离+刚刚添加的节点的距离到未确定最短距离的定点的距离 < 源最短距离,则更新 
        for(i=0;i<n;i++){
            if(!color[i] && matrix[index][i]!=INT_MAX && dist[index]+matrix[index][i]<dist[i]){
                 dist[i] = dist[index]+matrix[index][i];
                 path[i] = index;
            }
        }
    }
}


int main(){

    int** matrix = get_graph();
    int i,t;

    single_source_shortest_path(matrix,source);

    printf("\n");
    for(i=0;i<n;i++){
        printf("%d: %d,and the path is(inverse order): %d ",i,dist[i],i);
        t = path[i];
        while(1){
            printf(" %d ",t);
            if(t==0){
                break;
            }
            t = path[t];
        }
        printf("\n");
    }

    printf("\n");
    return EXIT_SUCCESS;
}

运行结果如下:
这里写图片描述

0
0
查看评论

Dijkstra算法求最短路径问题完整C代码

算法基本思想和过程      单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。 一.最短路径的最优子结构性质    该性质描述为:如果P(i,j)={Vi....
  • u014488381
  • u014488381
  • 2014-11-26 09:31
  • 10577

单源最短路径(Dijkstra)——贪心算法

Dijkstra算法是解单源最短路径问题的贪心算法。其基本思想是,设置顶点集合点集合S并不断地做贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的其一顶点。把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组Distanc...
  • laoniu_c
  • laoniu_c
  • 2014-08-09 11:55
  • 5451

Dijkstra算法求无向图单源最短路径(C语言实现)

  • 2014-06-06 23:11
  • 6KB
  • 下载

c语言 单源最短路径源代码

  • 2011-06-30 22:36
  • 74KB
  • 下载

C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)

图的基本概念和广度及深度遍历,求单源最短路径的Dijkstra算法
  • to_perfect
  • to_perfect
  • 2016-12-24 09:22
  • 1615

最短路径之Dijkstra算法 C语言实现

Dijkstra算法(单源点路径算法,要求:图中不存在负权值边): 步骤: a.  初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即: U={其余顶点},若v与U中顶点u有边,则u的距离设置为相应的权值,若u v之间不存在边,则   ...
  • qq_34845121
  • qq_34845121
  • 2017-03-14 21:04
  • 2416

c语言实现求最短路径(迪杰斯特拉算法,《数据结构》算法7.15)

迪杰斯特拉算法从小到大的求出了从源点到其余各个点的最短路径,用到了邻接矩阵的储存结构。 代码如下:#include #define MAX_VERTEX_NUM 100 #define INFINITY 2000000000 typedef struct { int vexs[MAX_VERTE...
  • L_BestCoder
  • L_BestCoder
  • 2016-03-03 21:13
  • 3437

Dijkstra算法求单源最短路径

1.最短路径在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同。如果是一个带权图,那么路径长度为路径上各边的权值的总和。两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度。最短路径在实际中有重要的应用价值。如用顶点表示城市,边表示...
  • K346K346
  • K346K346
  • 2016-04-02 18:21
  • 8605

Dijkstra单源最短路径,适合稠密图,顶点少,边多(c语言)

思路: ①随意选择一个点v,然后用distance数组记录起始点v到所有点的距离 ②然后在distance数组中找到起始点v到哪一个点的距离最短,以这个点u为中介,found[u]=1,证明集合中已经有这个点,证明该点走过 ③使用choose函数通过循环,可以知道哪一个点到起始点最...
  • m0_37787222
  • m0_37787222
  • 2017-12-04 20:47
  • 87

单源最短路径

  • 2012-11-02 17:47
  • 2KB
  • 下载
    个人资料
    • 访问:591980次
    • 积分:8291
    • 等级:
    • 排名:第2906名
    • 原创:212篇
    • 转载:331篇
    • 译文:0篇
    • 评论:82条
    最新评论