迪杰斯特拉算法_优化版

迪杰斯特拉优化版本:vector + 优先队列

△迪杰斯特拉算法的核心:每次找距离s点最短的元素 + 松弛操作

①要用优先队列取出最短距离降低时间复杂度,用veotor减少空间

②定义一个pair类型,作为优先队列的元素。typedef pair<int , int > P ,first是距离,second是边的终点

③pair类型作为优先队列的元素时,默认排序是先排序first,后再排序second。(升序)

因此,距离是first,边的终点是second,不可调换

#include <stdio.h>
#include <queue>
#include <string.h>
#define MAX 100

using namespace std;

typedef pair<int,int> P;        //first:dis[i]  second:下标i,边的终点
vector<P> map[MAX];                //不能先下标后权值,因为pair先排序first后排序second
int vis[MAX];
int dis[MAX];
priority_queue<P, vector<P>, greater<P> > q;
const int INF = 0x3f3f3f3f;

void Dijkstra(int s, int n){
    memset(dis,INF,sizeof(dis));
    memset(vis,0,sizeof(vis));
    dis[s]=0;
    q.push(P(0,s));        //将起始点push入队列
    while(!q.empty()){
        P p =q.top();    //每次取最小元素
        q.pop();        //出队
        int u=p.second;
        if(vis[u])    continue;
        vis[u]=1;
        for(int i=0;i<map[u].size();i++){        //i并不是边的终点,只是顺序存储的东西
            int v=map[u][i].second;                //获取边的终点v
            int w=map[u][i].first;                 //获取u到v的距离
            if(!vis[v]){
                if(dis[v]>dis[u]+w){
                    dis[v]=dis[u]+w;
                    q.push(P(dis[v],v));       //松弛操作过的元素入队
                }
            }
        }
    }
}

int main(){
    int n,m,s;
    int u,v,w;
    while(scanf("%d %d %d",&n,&m,&s)!=EOF){            //顶点数n, 边数m, 起始点s
        for(int i=1;i<=n;i++)
            map[i].clear();        //清空vector  注意 vector 不能用二维数组初始化
        for(int i=0;i<m;i++){
            scanf("%d %d %d",&u,&v,&w);
            map[u].push_back({w,v});        //无向图
            map[v].push_back({w,u});        //有向图只push一次
        }
        Dijkstra(s,n);
        for(int i=1;i<=n;i++)
            printf("%d    ",dis[i]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/shiliuxinya/p/12180782.html

时间: 2024-08-05 15:07:35

迪杰斯特拉算法_优化版的相关文章

迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 让我来翻译一下:Dijkstra可以求出一个点到一个图中其他所有节点的最短路径,故也称对于单源最短路径的一种解法 算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即

hdu 2112 HDU Today &lt;迪杰斯特拉算法+map函数&gt;

HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19697    Accepted Submission(s): 4635 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候

迪杰斯特拉算法求最短距离

头文件: #include <memory.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #include ".\source\common.h" #include "lxbasic.h" #define MAX_VEX_NUM  20 #define MAX_STR_LEN  20 #define INFINITY  999  //无穷大

用迪杰斯特拉算法实现地铁的站点搜索

上一篇文章,利用迪杰斯特拉(dijkstra)算法,实现了无向图的最短路径搜索功能.本篇将以南京地铁为例,用迪杰斯特拉算法实现两个站点之间的最短路径搜索. 借用百度百科,南京2015年4月份的地铁运行线路图如下: 创建一个数据构造类,初始化南京地铁的各条线路站点数据(截至2015年4月南京地铁运营公司数据,与上图对应) /** * */ package com.test.dijkstra; import java.util.ArrayList; import java.util.HashSet;

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

图结构中应用的最多的就是最短路径的查找了,关于最短路径查找的算法主要有两种:迪杰斯特拉算法(Dijkstra)和Floyd算法. 其中迪杰斯特拉算法(Dijkstra)实现如下: 原理就是不断寻找当前的最优解: void main() { int V[Max][Max]={0,8,32,Infinity,Infinity, 12,0,16,15,Infinity, Infinity,29,0,Infinity,13, Infinity,21,Infinity,0,7, Infinity,Infi

迪杰斯特拉算法——PAT 1003

本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究就会发现越经典. 首先可以将整个图的节点看成两个集合:一个是S,一个是U-S.如果是求v0到图中各点的最短距离的话,那么S就是已经确认到v0距离最短的点,U-S则是对于整体的点集合U,还没有加入S集合的点. 这里提出一个算法总体的思想,将所有的点按照一定的原则加入到S集就是解集.而这个解法就是重点了

数据结构之单源最短路径(迪杰斯特拉算法)-(九)

最开始接触最短路径是在数据结构中图的那个章节中.运用到实际中就是我在大三参加的一次美赛中,解决中国的水资源问题.所谓单源最短路径,就是一个起点到图中其他节点的最短路径,这是一个贪心算法. 迪杰斯特拉算法原理(百科): 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的集合(初始时只含有源点V0) (2)V-S=T:尚未确定的顶点集合 将T中顶点按递增的次序加入到S中,保证: (1)从源点V0到S中其他各顶点的长度都不大于从V0到T中任何顶点的最短路径长度 (2)每个顶

迪杰斯特拉算法介绍

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s

图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪杰斯特拉算法 求从源点到其余各点的最短路径 依最短路径的长度递增的次序求得各条路径 路径长度最短的最短路径的特点: 在这条路径上,必定只含一条弧,并且这条弧的权值最小. 下一条路径长度次短的最短路径的特点: 它只可能有两种情况:或是直接从源点到该点(只含一条弧):或者是从源点经过顶点v1,再到达该顶