最短路径(Dijkstra算法)

原创 2018年04月16日 20:15:09

给你坐标最大为n,边数为m的无向边,输入m条,为x->y,长度为k

求起点(st)到终点(ed)的最短路径

dij()算法分析:

有三个数组,d[]用于记录最短路径,mp用于存储边,vis[]用于标记(标记过的点为已经计算出最短路径的点)

先重置vis[]

在对起点可以一次到达的位置载入到d[]中

设置d[0]=0(起点到起点自然为0)

标记vis[0]

寻找离起点最近的点(且没有被标记过的),然后标记它(已经求出最短距离)

然后更新其它与这个最近点有关的点

#include<iostream>
#include<cstring>
#include<cstdio>
#define inf 0x1f1f1f1f
using namespace std;
int d[151],mp[151][151];
int ans,visit[151];
int n,m;
int st,ed;

void dij()          ///广度优先搜索思想
{
 int i,j,k,v,minx;
 memset(visit,0,sizeof(visit));///初始化标记数组

 for(i=0;i<=n;i++)             ///初始化原始路径(起始位置可以一次到达的点的距离)
    d[i]=mp[st][i];

 d[st]=0;
 visit[st]=1;                  ///对初始点进行标记

 for(i=0;i<=n;i++)
 {

    minx=inf;
    for(j=0;j<=n;j++) ///用于寻找最近(小)的点且没有标记过的点
       if(minx>d[j]&&!visit[j])
        {
          minx=d[j];
          v=j;
        }
    visit[v]=1;               ///对该点进行标记(已经是最短距离)

    for(k=0;k<=n;k++)         ///更新其他点的最短距离(当前)
     if(!visit[k])
        d[k]=min(d[k],d[v]+mp[v][k]);

 }
 printf("%d\n",d[ed]);
}

int main()
{
 int x,y,k;
 while(scanf("%d%d",&n,&m),n!=0||m!=0)///有n个点,m条边
 {
  for(int i=0;i<=n;i++)       ///初始化距离
    for(int j=0;j<=n;j++)
      mp[i][j]=inf;

  for(int i=0;i<m;i++)        ///输入的点的标号不可以大于n
  {
   scanf("%d%d%d",&x,&y,&k);
   if(mp[x][y]>k)             ///如果有路比原来的路还短,则重置为短路径
    mp[x][y]=mp[y][x]=k;      ///输入已知距离(该算法的路径是双向路径)
  }
  scanf("%d%d",&st,&ed);
  dij();

 }
 return 0;
}


经典算法之图的最短路径(一):Dijkstra算法

Dijkstra算法可以说基本上每一本有讲到图的最短路径的书上都会有的一个算法,但基本上都是讲原理和伪代码,今天自己用Java代码给实现了一下,记录在此。 Dijkstra算法只是解决某些图的最短路径...
  • silent_strings
  • silent_strings
  • 2015-09-01 15:50:47
  • 2959

利用Dijkstra算法实现记录每个结点的所有最短路径

我们知道,Dijkstra是解决单源最短路问题的,并且最基本的算法仅能求出最短路的长度,而不能输出路径,本文基于Dinjkstra进行改进,使之能记录源点到任意点的所有最短路径。使用vector来记录...
  • xyt8023y
  • xyt8023y
  • 2015-05-29 13:16:03
  • 3409

单元Dijkstra算法求最短路径的的Java实现

上一篇写了无权值的最短路径的求法,是利用广度优先搜索的方法使用队列实现的,当有权值时,我们通常使用Dijkstra算法来求解最短路径的问题,这里我们假设所有的权值都是正值。 首先,在节点类改变了权值的...
  • qq_20991785
  • qq_20991785
  • 2015-03-17 11:08:21
  • 980

获取多条最短路径的Dijkstra算法

学习Dijkstra算法,并扩展成可以获取所有最短路径
  • u013615687
  • u013615687
  • 2017-04-04 14:43:24
  • 1596

最短路径—Dijkstra算法和Floyd算法(理解)

Floyd-Warshall——只有五行的算法 求任意两个点之间的最短路程。 从i号顶点到j号顶点只经过前k号顶点的最短路程,这是一种动态规划的思想。 for(k=1;k...
  • m0_37345402
  • m0_37345402
  • 2017-08-05 00:02:15
  • 1635

图算法 最短路径 Dijkstra算法

问题背景简介:   最短路径问题是图算法中一个典型和常用的应用问题。 例如,某一地区内有N个城市,给定了这N个城市间两两之间的距离,求解城市A 和 B之间的最短距离。   抽象为数学模型: ...
  • hyhyl1990
  • hyhyl1990
  • 2015-08-11 16:42:03
  • 1265

有向图最短路径问题---Dijkstra算法(过程)

有向图最短路径问题---Dijkstra算法(过程)
  • cjc211322
  • cjc211322
  • 2014-05-03 20:47:40
  • 6845

最短路径问题---Dijkstra算法详解

前言 Nobody can go back and start a new beginning,but anyone can start today and make a new ending. ...
  • qq_35644234
  • qq_35644234
  • 2017-03-08 16:42:46
  • 58484

Dijkstra算法最短路径演示动画(数据结构)

  • a9529lty
  • a9529lty
  • 2009-04-03 13:44:00
  • 5976

最短路径之Dijkstra算法及实例分析

Dijkstra算法迪科斯彻算法 Dijkstra算法描述为:假设用带权邻接矩阵来表示带权有向图。首先引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点Vi的最短路径。它的初始...
  • u010758724
  • u010758724
  • 2014-03-27 15:30:24
  • 5865
收藏助手
不良信息举报
您举报文章:最短路径(Dijkstra算法)
举报原因:
原因补充:

(最多只允许输入30个字)