dijkstra算法求最短路

艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人。 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学。曾在1972年获得过素有计算机科学界的诺贝尔奖之称的图灵奖,之 后,他还获得过1974年 AFIPS Harry Goode Memorial Award、1989年ACM SIGCSE计算机科学教育教学杰出贡献奖、以及2002年ACM PODC最具影响力论文奖。

艾兹格·W·迪科斯彻(Edsger Wybe Dijkstra)

1 提出“goto有害论”;

2 提出信号量和PV原语;

3 解决了“哲学家聚餐”问题;

4 最短路径算法(SPF)和银行家算法的创造者;

5 第一个Algol 60编译器的设计者和实现者;

6 THE操作系统的设计者和开发者;

与D. E. Knuth并称为我们这个时代最伟大的计算机科学家的人。

与癌症抗争多年,于2002年8月6日在荷兰Nuenen自己的家中去世,享年72岁。

Dijkstra算法C代码

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

#define  MAXINT  32767
#define  MAXNUM  6

char *str = "ABCDEF";
void dijkstra(int *dist, int *prev, int (*A)[MAXNUM], int v0);
void findPath(int *dist, int *prev, int start, int end);

int main()
{

    int A[MAXNUM][MAXNUM] = {{0, 6, 3, MAXINT, MAXINT, MAXINT},
                             {6, 0, 2, 5,      MAXINT, MAXINT},
                             {3, 2, 0, 3,      4,      MAXINT},
                             {MAXINT, 5, 3, 0, 2,           3},
                             {MAXINT, MAXINT, 4, 2, 0,      5},
                             {MAXINT, MAXINT, MAXINT, 3, 5, 0},
                            };
    int dist[MAXNUM] = {0};
    int prev[MAXNUM] = {0};
    int v0 = 2, i = 0;

    dijkstra(dist, prev, A, v0);

    findPath(dist, prev, v0, 5);

    //for(i = 0; i < MAXNUM; i++)
    {
    //    printf("%d ", prev[i]);
    }

    system("pause");
    return 0;
}

void findPath(int *dist, int *prev, int start, int end)
{
    int tmp = prev[end];
    int *rst = (int*)calloc(MAXNUM, sizeof(int));
    int cnt = 0, i = 0;
    rst[cnt] = end;
    cnt++;
    if(tmp == start)
    {
        rst[cnt] = tmp;
    }
    else
    {
        while(tmp != start)
        {
            rst[cnt] = tmp;
            tmp = prev[tmp];
            cnt++;
        }
        rst[cnt] = tmp;
    }

    //printf("%d\n", cnt);
    for(i = cnt; i >= 0; i--)
    {
        printf("%c", str[rst[i]]);
        if(i != 0)
        {
            printf("->");
        }
    }
    printf("  %d\n", dist[end]);

    free(rst);
    rst = NULL;

}

void dijkstra(int *dist, int *prev, int (*A)[MAXNUM], int v0)
{
    int S[MAXNUM];
    int n = MAXNUM, i = 0, j = 0;
    for (i = 0; i < n; i++)
    {
        dist[i] = A[v0][i];
        S[i] = 0;
        if(dist[i] == MAXINT)
        {
            prev[i] = -1;
        }
        else
        {
            prev[i] = v0;
           // printf("%c前驱%c\n", str[i], str[v0]);
        }
    }
    dist[v0] = 0;
    S[v0] = 1;

    for(i = 1; i < n; i++)
    {
        int mindist = MAXINT;
        int u = v0;
        for(j = 0; j < n; j++)
        {
            if((!S[j]) && dist[j] < mindist)
            {
                u = j;
                mindist = dist[j];
            }
        }
        S[u] = 1;

        for(j = 0; j < n; j++)
        {
            if((!S[j]) && A[u][j] < MAXINT)
            {
                if(dist[u] + A[u][j] < dist[j])
                {
                    dist[j] = dist[u] + A[u][j];
                    prev[j] = u;
                   // printf("%c前驱%c\n", str[j], str[u]);
                }
            }
        }
    }
}

代码仅供参考

参考资料

  1. 百度百科   http://baike.baidu.com/link?url=LWr-IQcqdJoG9qAz_kmQ6kIybBDqEqj0bo3dk-t3A_vtd0P_Ee1EvCWm3iQokRWmregR_vLSt7zgB_wSVqvCaq
  2. 最短路径—Dijkstra算法和Floyd算法   http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html
时间: 2024-10-05 16:33:23

dijkstra算法求最短路的相关文章

_DataStructure_C_Impl:Dijkstra算法求最短路径

// _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4]; typedef char InfoPtr; typedef int VRType; #define INFINITY 100000 //定义一个无限大的值 #define MaxSize 50 //最大顶点个数 typedef int P

Dijkstra算法求最短路径(java)(转)

原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式用OPEN,CLOSE表的方式,其采用的是贪心法的算法策略,大概过程如下:1.声明两个集合,open和close

Dijkstra算法求最短路径

摘自最短路径算法,如有任何侵权问题,请及时通知本人,本人将马上予以删除. 链接算法过程 /* 有向图的构建及最短路径求解(Dijkstra) */ #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 30 #define MAX_INT 1000 typedef int VrType; typedef char VtType; bool visted[MAX_VERTEX_NUM]; //搜索时的标记矩阵 ty

poj 2139 Floyd-Warshall算法求最短路

题意:不想说,这个题意思了,含糊不清=-= Dijkstra算法,无法计算有负边的图,原因是有负边的图存在是会打乱Dijkstra算法的前提,当前优先队列取出点的距离为起点到该点的最小距离,因为如果后面有负边这个距离会更小.除此之外Bellman-Ford算法和Floyd-warshall算法都可以计算有负边的图,且判断是否有负圈. Floyd-Warshall算法:该算法用到了动态规划归约的思想来求任意两点间的最短距离.令:d[k][i][j]为最短路可以包括0到k的所有顶点时i到j的最短距离

Dijkstra算法求单源最短路径

1.最短路径 在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同.如果是一个带权图,那么路径长度为路径上各边的权值的总和.两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度. 最短路径在实际中有重要的应用价值.如用顶点表示城市,边表示两城市之间的道路,边上的权值表示两城市之间的距离.那么城市A到城市B连通的情况下,哪条路径距离最短呢,这样的问题可以归结为最短路径问题. 求最短路径常见的算法有Dijkstra算法和Floyd算法

JAVA实践Dijkstra算法求最短路径距离

前言 Dijkstra算法用于求指定顶点到其他顶点的最短距离,时间复杂度O(N^2),据说可以使用堆优化到O(log N),然而还不会. 其特点是(对我来说)非常容易求得路径,和对应的距离. 缺陷也是存在的,此算法不能处理负权边.即距离为负时,就挂了. 此文内容同样参考<啊哈,算法> 另外个人感觉代码可能有错,还望有心人指点. 功能实现 输入一个顶点 输出路径 输出与路径对应的距离 如果存在不可到达的顶点,则输出该顶点不可到达 中文版参考 对应的二维数组 {0, 1, 12, INF, INF

Dijkstra算法(最短路)

Dijkstra算法是单源最短路径算法:利用的是贪心思想,每次选择当前的最靠近源点的顶点确定为最短路径(所以Dijkstra算法需要满足的是所有边的权值都为正值,所以Dijkstra不能处理负边权问题). 算法思路: 1. 将所有点分为两部分:已知最短路径顶点和未知最短路径顶点,先将源点加入已知最短路径,利用book[]存储. 2. 初始化各顶点的最短路径,有源点直接相连的点设置为边的权值,没有直接相连的点设置为无穷大: 3. 在所有未知最短路径的顶点中寻找距离最小的将其确定为最短路径,并对这点

Dijkstra算法求最短路径 C++实现

Dijstra算法代码借鉴: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define Inf 0x3f3f3f3f using namespace std; int map[1005][1005];//存储输入数组值 int vis[1005],dis[1005];//vis标记数组,dis最短路径 int n,m;//n个点,m条边 void Ini

[算法学习]Bellman-Ford算法求最短路

OAO dijkstra算法在复杂度方面是十分优秀的,但是其最大弊端就是无法处理带负权的图 (因为是基于已经被更新过的距离源点的边必然已经达到了最短路的这个事实 来采取贪心策略来求得最短路 而有负权路存在时,这个基础不在成立.) 这个时候就要请出Bellman-Ford算法了 (正确性证明:https://oi-wiki.org/graph/shortest-path/) 贴个代码emm: #include<bits/stdc++.h> using namespace std; //Bellm