迪杰斯特拉算法(Dijkstra)
模板一:
时间复杂度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)的更多相关文章
- 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少
首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...
- C# 迪杰斯特拉算法 Dijkstra
什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...
- 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)
文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...
- 迪杰斯特拉算法dijkstra(可打印最短路径)
#include <iostream> #include <iomanip> #include <string> using namespace std; #def ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...
- dijkstra算法(迪杰斯特拉算法)
dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...
- 理解最短路径——迪杰斯特拉(dijkstra)算法
原址地址:http://ibupu.link/?id=29 1. 迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...
- Dijkstra【迪杰斯特拉算法】
有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
随机推荐
- Java数组相关算法一
一.数组反转 1.方法一:创建新数组 int[] arr = {6,29,0,4,3}; int[] arr2 = new int[arr.length]; for (int i = 0; i < ...
- vue2.0在IE11无法打开的解决办法
npm 安装bebel-polyfill npm install --save-dev babel-polyfill 在webpack.base.conf.js文件中将 module.exports ...
- zabbix 微信告警脚本
#!/usr/bin/env python3 import requests import json import sys import os def access_token(Corpid,Secr ...
- idea 创建 SSM + maven Java Web 项目流程
idea 创建 SSM + maven Java Web 项目流程 一.idea 中选择File,New Project 新建项目 二.选择Maven,勾选上面的Create from archety ...
- activiti 5.22 表结构解析及清空流程运行测试数据
1.结构设计 1.1. 逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: 'RE'表示repository(存储),RepositoryService接口所操作的 ...
- 框架frameset
转自: http://www.cnblogs.com/sunfeiwto/archive////.html <FRAMESET> <FRAME> <NOFRAMES> ...
- Zookeeper3.4.14集群搭建
环境: 3台centos7.4 1. 下载release:wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3. ...
- Git 常用命令简单记录
分布式版本控制系统,跟踪文本文件的改动 ubuntu安装: sudo apt install git 安装完成后,设置使用的用户名和邮箱: 全局: git config --global user.n ...
- Sass-变量计算
在 Sass 中除了可以使用数值进行运算之外,还可以使用变量进行计算,其实在前面章节的示例中也或多或少的向大家展示了.在 Sass 中使用变量进行计算,这使得 Sass 的数学运算功能变得更加实用.一 ...
- zuul 详解
zuul的简单使用与分析: https://www.jb51.net/article/106716.htm https://www.jianshu.com/p/ff863d532767 zuul自定义 ...