模板一:

时间复杂度O(n2

 int dijkstra(int s,int m)  //s为起点,m为终点
{
memset(dist,,sizeof(dist)); //初始化,dist数组用来储存s到各个点的距离
memset(v,,sizeof(v)); //初始化v数组,是否已标记
for(int i=;i<=n;++i) //++i返回的是引用,稍微快一点
{
dist[i]=e[s][i]; //初始化,e[s][i]数组表示是点s到点i的权值,数组e用来存有向图或无向图的权值,用INF初始化
}
for(int i=;i<=n;++i)
{
k=INF,u=;
for(int j=;j<=n;++j) //找出当前dist最小的点
{
if(!v[j]&&dist[j]<k)
{
k=dist[j];
u=j;
}
}
v[u]=; //标记
for(int j=;j<=n;++j) //更新与点u相连的点的权值和
{
if(!v[j]&&e[u][j]<INF&&dist[u]+e[u][j]<dist[j]) //比较从点s到点u载到点j的权值和点s直接到点j的权值
{
dist[j]=dist[u]+e[u][j];
}
}
}
return dist[m];
}

模板二:

时间复杂度 O(mlogn)m为边数,n为顶点数。

对于稀疏图的效果显著,对稠密图慎用。

 const int INF = 0x3f3f3f3f;
const int maxn = ;
struct Edge
{
int from, to, dist;
Edge(int u, int v, int d) :from(u), to(v), dist(d) {}
};
struct HeapNode
{
int d, u;
HeapNode(int D,int U):d(D),u(U){}
bool operator < (const HeapNode& rhs) const {
return d > rhs.d;
}
};
struct Dijkstra
{
int n, m;
vector<Edge> edges;
vector<int> G[maxn]; //maxn要大于顶点数
bool done[maxn];
int d[maxn];
int p[maxn]; void init(int n)
{
this->n = n;
for (int i = ; i < n; ++i)
G[i].clear();
edges.clear();
} void addEdge(int from, int to, int dist)
{
edges.push_back(Edge(from, to, dist));
m = edges.size();
G[from].push_back(m - );
} void dijkstra(int s, int kk) //s为起点 kk为终点
{
priority_queue<HeapNode> Q;
for (int i = ; i < n; ++i)
d[i] = INF;
d[s] = ;
memset(done, , sizeof(done));
Q.push(HeapNode( , s ));
while (!Q.empty())
{
HeapNode x = Q.top();
Q.pop();
int u = x.u;
if (u == kk) //到终点就退出
{
printf("%d\n", x.d);
break;
}
if (done[u])
{
continue;
}
done[u] = true;
for (int i = ; i < G[u].size(); ++i)
{
Edge& e = edges[G[u][i]];
if (d[u] + e.dist < d[e.to])
{
d[e.to] = d[u] + e.dist;
p[e.to] = G[u][i];
Q.push(HeapNode(d[e.to], e.to ));
}
}
}
} };

放一道模板题

http://acm.hdu.edu.cn/showproblem.php?pid=2544

AC代码

 #include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = ;
struct Edge
{
int from, to, dist;
Edge(int u, int v, int d) :from(u), to(v), dist(d) {}
};
struct HeapNode
{
int d, u;
HeapNode(int D,int U):d(D),u(U){}
bool operator < (const HeapNode& rhs) const {
return d > rhs.d;
}
};
struct Dijkstra
{
int n, m;
vector<Edge> edges;
vector<int> G[maxn]; //maxn要大于顶点数
bool done[maxn];
int d[maxn];
int p[maxn]; void init(int n)
{
this->n = n;
for (int i = ; i < n; ++i)
G[i].clear();
edges.clear();
} void addEdge(int from, int to, int dist)
{
edges.push_back(Edge(from, to, dist));
m = edges.size();
G[from].push_back(m - );
} void dijkstra(int s, int kk) //s为起点 kk为终点
{
priority_queue<HeapNode> Q;
for (int i = ; i < n; ++i)
d[i] = INF;
d[s] = ;
memset(done, , sizeof(done));
Q.push(HeapNode( , s ));
while (!Q.empty())
{
HeapNode x = Q.top();
Q.pop();
int u = x.u;
if (u == kk)
{
printf("%d\n", x.d);
break;
}
if (done[u])
{
continue;
}
done[u] = true;
for (int i = ; i < G[u].size(); ++i)
{
Edge& e = edges[G[u][i]];
if (d[u] + e.dist < d[e.to])
{
d[e.to] = d[u] + e.dist;
p[e.to] = G[u][i];
Q.push(HeapNode(d[e.to], e.to ));
}
}
}
} };
int n, m, x, y, k;
Dijkstra d;
int main()
{
while (cin>>n>>m)
{
d.init(n);
if (n == && m == )
break;
while (m--)
{
cin >> x >> y >> k;
d.addEdge(x - , y - , k);
d.addEdge(y - , x - , k);
}
d.dijkstra(, n - );
}
return ;
}

持续更新……

迪杰斯特拉算法(Dijkstra)的更多相关文章

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

    首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...

  2. C# 迪杰斯特拉算法 Dijkstra

    什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...

  3. 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)

    文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...

  4. 迪杰斯特拉算法dijkstra(可打印最短路径)

    #include <iostream> #include <iomanip> #include <string> using namespace std; #def ...

  5. 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

    迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...

  6. 最短路径之迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...

  7. dijkstra算法(迪杰斯特拉算法)

    dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...

  8. 理解最短路径——迪杰斯特拉(dijkstra)算法

    原址地址:http://ibupu.link/?id=29 1.       迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...

  9. Dijkstra【迪杰斯特拉算法】

    有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...

  10. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

随机推荐

  1. Java数组相关算法一

    一.数组反转 1.方法一:创建新数组 int[] arr = {6,29,0,4,3}; int[] arr2 = new int[arr.length]; for (int i = 0; i < ...

  2. JVM(4)之 使用MAT排查堆溢出

    开发十年,就只剩下这套架构体系了! >>>   接下来讲解如何设置以及当发生堆溢出的时候怎么排查问题.先看一小段代码:     代码中使用了一个无限循环来为list添加对象,如果采用 ...

  3. Java Predicate

    Predicate 接口说明 /* * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. * O ...

  4. TMS320C6455BCTZA 原厂订购 原装正品

    作为一家科研公司,保证芯片的原厂品质和正规采购渠道是科学严谨的研发工作中重要的一环,更是保证研发产品可靠.稳定的基础.而研发中所遇到的各种不可预测的情况更是每个工程师向技术的山峰攀登中时会遇到的各种难 ...

  5. vue之路由传参三种基本方式

    现有如下场景,点击父组件的li元素跳转到子组件中,并携带参数,便于子组件获取数据. 父组件中: <li v-for="article in articles" @click= ...

  6. 微信小程序学习二 微信小程序的项目结构

    进来之后可以看到五个文件和两个文件夹,一般新建的小程序项目都是这种格式,但有些可能会不一样,不用担心,因为我们所要关注的文件是不会变的 pages 小程序的页面放置文件夹,每一个页面(page)包含四 ...

  7. python基础:3.高级运算符

    1.异或运算 十进制的异或运算,先转成二进制进行异或,按位进行比较,对应位置相同则为0,对应位置不同则为1,,再从异或结果转成十进制. python中: 1 ^ 1 = 0 1 ^ 2 = 3 1 ^ ...

  8. C#高级编程笔记 (6至10章节)运算符/委托/字符/正则/集合

    数学的复习,4^-2即是1/4/4的意思, 4^2是1*2*2的意思,而10^-2为0.01! 7.2运算符 符号 说明 例   ++ 操作数加1 int i=3; j=i++; 运算后i的值为4,j ...

  9. Vue.js----date与时间戳的转换(unixTime)Moment.js让日期处理变得更简单

    当前日期格式化 let curTime = moment().format('YYYY-MM-DD HH:mm:ss') console.log('当前日期时间curTime:' + curTime) ...

  10. centos7在线安装mysql8.0.16

    一.官网复制安装源地址: 1.进入官网地址:https://dev.mysql.com/downloads/repo/yum/ 二.进入/usr/local目录下 ,创建mysql文件夹 三.使用命令 ...