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 Init ()
{
    memset(map,Inf,sizeof(map));//初始化map数组
     for(int i=1;i<=n;i++)
    {
        map[i][i]=0;
    }//将该节点到该节点的权值置0,即数组斜线上的值置0
}
void Getmap()
{
    int u,v,w;
    for(int t=1;t<=m;t++)
    {
          scanf("%d%d%d",&u,&v,&w);//输入数组行列下标及该点的权值
          if(map[u][v]>w)//如果初始化的map[][]数组值(init函数置无穷大)大于 当前输入的权值
          {
          map[u][v]=w;
          map[v][u]=w;
          }
    }    

}
void Dijkstra(int u)//对结点进行操作
{
    memset(vis,0,sizeof(vis));//vis数组清空
    for(int t=1;t<=n;t++)
    {
        dis[t]=map[u][t];//从map第一列开始将值存到dis数组中,dis数组存放最短路径权值
    }
    vis[u]=1;//将vis数组置的n结点权值为1 ,标记数组,代表已经访问过
    //两重for循环找最短路径
    for(int t=1;t<n;t++)
    {
        int minn=Inf,temp;//定义变量min为无穷大
        for(int i=1;i<=n;i++)
        {
            if(!vis[i]&&dis[i]<minn)//没有访问过该节点,且存放最短路径的dis数组在该点权值小于minn
            {
                minn=dis[i];//将dis数组在该点的权值更新到minn变量中保存
                temp=i;//更新数组下标
            }
        }
        vis[temp]=1;//标记已访问过该点

        for(int i=1;i<=n;i++)
        {
            if(map[temp][i]+dis[temp]<dis[i])//如果当前结点的权值+存放在最短路径的当前结点的权值累加和 小于 前一个结点的权值
            {
                dis[i]=map[temp][i]+dis[temp];//则更新前一个结点的权值
            }
        }
    }

}

int main()
{
    scanf("%d%d",&m,&n);
    Init();
    Getmap();
    Dijkstra(n);
    printf("%d\n",dis[1]);//打印数组下标为1到其他点的单源最短路径
    return 0;
}

Dijkstra算法的主要思路:

map初始化数组,vis标记数组,dis存放最短路径长度

核心代码:

    for(int t=1;t<n;t++)
    {
        int minn=Inf,temp;//定义变量min为无穷大
        for(int i=1;i<=n;i++)
        {
            if(!vis[i]&&dis[i]<minn)//没有访问过该节点,且存放最短路径的dis数组在该点权值小于minn
            {
                minn=dis[i];//将dis数组在该点的权值更新到minn变量中保存
                temp=i;//更新数组下标
            }
        }
        vis[temp]=1;//标记已访问过该点

        for(int i=1;i<=n;i++)
        {
            if(map[temp][i]+dis[temp]<dis[i])//如果当前结点的权值+存放在最短路径的当前结点的权值累加和 小于 前一个结点的权值
            {
                dis[i]=map[temp][i]+dis[temp];//则更新前一个结点的权值
            }
        }
    }

类似于prime算法, Dijkstra算法的对象无所谓是有向图还是无向图,它可以求单源最短路径(一个点到其余各点的最短路径),时间复杂度为O(n*n)。

区别:

核心思想就是更新连接路径时,prime中是跟踪接下来的结点到生成树中的最小交叉边,而dijkstra中是跟踪接下来的结点到

起点所有经过的结点的路径和。

原文地址:https://www.cnblogs.com/javabai/p/10988842.html

时间: 2024-10-20 16:25:16

Dijkstra算法求最短路径 C++实现的相关文章

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

_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

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

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

Java实现Dijkstra算法求最短路径

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

迪杰斯特拉(Dijkstra)算法求最短路径

我用的是邻接矩阵来存储图的. 代码如下: void Graph:: Dijkstra(){ struct DijNode{ int index; int distance; vector<string> path; bool Founded; //判定是否找到了... }; DijNode*shorestPaths=new DijNode[mgraph.vexnum]; string startPoint; int startIndex; cout<<"请输入单源点:&q

python Dijkstra算法实现最短路径问题的方法

这篇文章主要介绍了python Dijkstra算法实现最短路径问题的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 从某源点到其余各顶点的最短路径 Dijkstra算法可用于求解图中某源点到其余各顶点的最短路径.假设G={V,{E}}是含有n个顶点的有向图,以该图中顶点v为源点,使用Dijkstra算法求顶点v到图中其余各顶点的最短路径的基本思想如下: 使用集合S记录已求得最短路径的终点K线图的跳空,初始时S={v}.

dijkstra算法计算最短路径和并输出最短路径

1 void dijisitela(int d, int m1) 2 { 3 int dis[1000], book[1000], path[1000], u, v, min; 4 l = 1; 5 for (i = 0; i < n1; i++) 6 { 7 dis[i] = w[d][i]; 8 book[i] = 0; 9 path[i] = -1; 10 midpath[0][i] = -1; 11 } 12 midsum[0] = 0; 13 book[0] = d; 14 15 //

Dijkstra算法求单源最短路径

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