dijkstra算法 - 最短路径算法

2017-07-26 22:30:45

writer:pprp

dijkstra算法法则:设置顶点集合S,首先将起始点加入该集合,然后根据起始点到其他顶点的路径长度,

选择路径长度最小的顶点加入到集合S,根据所加入顶点更新源点到其他顶点的路径长度,然后再选取最小边的顶点;

实现:用邻接矩阵

我的理解:从某一点出发,找到与该点临近有路径的点,找到其中最短路径的点,将其标记,表示已经访问过了,

然后更新距离的数组(如果通过两步路径和要比一步的路要短),还需要在深刻理解一下;



代码如下:

#include <iostream>

using namespace std;

const int INF = 99999999;
int n;
int map[1001][1001];  //储存图
int visit[1001];   //设置访问标记
int d[1001];    //源点到各节点的最小距离

void init()
{
    cin >> n;
    for(int i = 1; i <= n ; i++)
        for(int j = 1; j <= n ; j++)
        {
            cin >> map[i][j];
            if(map[i][j] == 0)
                map[i][j] = INF;
        }
}

void Dijkstra(int x)  //从x点开始到其他源点的距离
{
    int i,j,Min,p;
    for(i =1; i<=n; i++)
        d[i] = map[x][i];  //初始化最小距离
    visit[x] = 1;    //标记为已访问过
    d[x] = 0;       //自身到自身为0
    for(i = 1; i < n; i++)
    {
        Min = INF;            //找最小边
        for(j = 1; j<=n; j++)  //找出总和最短路径
        {
            if(!visit[j]&&Min>d[j])
            {
                p = j;
                Min = d[j];
            }
        }
        visit[p] = 1;
        for(j = 1; j <= n; j++)
        {
            if(!visit[j]&&Min+map[p][j]<d[j])
                d[j] = Min+map[p][j];
        }
    }
    for(i = 1;i <= n ;i++)
      cout <<d[i]<<" ";
    cout << endl;
}

int main()
{
    init();
    Dijkstra(1);
    return 0;
}
时间: 2024-08-08 13:57:12

dijkstra算法 - 最短路径算法的相关文章

数据结构和算法-最短路径

针对无权图可以使用深度优先和广度优先算法, 有权图可以使用最短路径算法 Dijkstra(迪杰斯特拉算法): 在有向加权图中查找最短路径 注意: 该算法只适用于有向无环图, 不适用于负权边的情况 思路: 找出距离起点最近的节点 对于该节点邻居, 检查是否有前往他们的更短路径, 如果有就更新开销 重复以上两步, 直到所有节点运行过 找出最短路径 下表为要从起点到达终点, 数字为花费的时间 父节点 节点 花费 start A 6 start B 2 B A 5 B end 7 A end 6 上图是

Dijkstra最短路径算法

求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. 我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下. 我们将此时dis数组中的值称为最短路的“估计值”. 既然是求1号顶点到其余各个顶点的最短路程,那就先找一个离1号顶点最近的顶点.通过数组dis可知当前离1号顶点最近是2号顶点.当选择了2号顶点后,dis[2]的值就已经从“估计值”变为了“确定值”,即1号顶点到2号顶

最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)

一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine-->mine..... 那么,就存在这样一个问题:给定一个单词作为起始单词(相当于图的源点),给定另一个单词作为终点,求从起点单词经过的最少变换(每次变换只会变换一个字符),变成终点单词. 这个问题,其实就是最短路径问题. 由于最短路径问题中,求解源点到终点的最短路径与求解源点到图中所有顶点的最短路径复

几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较(转)

几大最短路径算法比较 几个最短路径算法的比较:Floyd        求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3).       Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题. Floyd-Warshall算法的时间复杂度为O(N^3),空间复杂度为O(N^2). Floyd-Warshall的原理是动态规划:设Di,j

(最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍

这一篇博客以一些OJ上的题目为载体.整理一下最短路径算法.会陆续的更新... 一.多源最短路算法--floyd算法 floyd算法主要用于求随意两点间的最短路径.也成最短最短路径问题. 核心代码: /** *floyd算法 */ void floyd() { int i, j, k; for (k = 1; k <= n; ++k) {//遍历全部的中间点 for (i = 1; i <= n; ++i) {//遍历全部的起点 for (j = 1; j <= n; ++j) {//遍历

单源最短路径算法---Dijkstra

Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负. 解题思路: V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路径的权值(程序中用dist[i]表示)已经确定.算法反复选择具有最短路径估计的顶点u 属于 V-S(即未确定最短路径的点,程序中finish[i]=false的点),并将u加入到S中(用finish[i]=true表示),最后对u的所有输出边进行松弛. 程序实现:      输入数据: 5 7 0

HDU 2112 HDU Today,最短路径算法,Dijkstra

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13396    Accepted Submission(s): 3144 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HD

有向有权图的最短路径算法--Dijkstra算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法, 在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算

带权图的最短路径算法(Dijkstra)实现

一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带权的.不带权的Dijkstra算法要简单得多(可参考我的另一篇:无向图的最短路径算法JAVA实现):而对于带权的Dijkstra算法,最关键的是如何“更新邻接点的权值”.本文采用最小堆主辅助,以重新构造堆的方式实现更新邻接点权值. 对于图而言,存在有向图和无向图.本算法只需要修改一行代码,即可同时实