图的最短路算法 Dijkstra及其优化
单源最短路径算法
时间复杂度O(N2) 优化后时间复杂度为O(MlogN)(M为图中的边数 所以对于稀疏图来说优化后更快)
不支持有负权的图
#include<iostream>
using namespace std;
const int maxn=1024;
const int inf=1<<30;
int n,m;
int d[maxn];
int v[maxn];
int G[maxn][maxn];
void init()
{
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) G[i][j]=(i==j?0:inf);
for(int i=2;i<=n;i++) d[i]=inf,v[i]=0;
d[1]=0;//这里默认是以1作为起点的
v[1]=0;
}
int main()
{
int from,to,dist;
cin>>n>>m;
init();
for(int i=0;i<m;i++){
cin>>from>>to>>dist;
G[from][to]=G[to][from]=dist;
}
for(int i=1;i<=n;i++){
int x,m=inf;
for(int j=1;j<=n;j++){
if(!v[j]&&d[j]<m)//写成'<'而不是'<='必须要确保图是联通的
m=d[x=j];
}
v[x]=1;
for(int j=1;j<=n;j++){
if(G[x][j]<inf/*防止溢出*/&&G[x][j]+d[x]<d[j])
d[j]=G[x][j]+d[x];
}
}
return 0;
}
优化后代码
//迪杰斯特拉算法的优化
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int maxn=1024;
const int inf=1<<30;
struct Edge{
int f,t,d;
};
struct Node{
int d,u;
bool operator<(const Node& b)const{
return d>b.d;
}
};
int n,m;
int d[maxn],v[maxn];
vector<int> G[maxn];
vector<Edge> edges;
priority_queue<Node> Q;
void init(){
for(int i=1;i<=n;i++) G[i].clear();
for(int i=1;i<=n;i++) v[i]=0;
for(int i=2;i<=n;i++) d[i]=inf;
d[1]=0;
}
int main()
{
int from,to,dist;
cin>>n>>m;
init();
for(int i=0;i<m;i++){
cin>>from>>to>>dist;
edges.push_back((Edge){from,to,dist});
G[from].push_back(edges.size()-1);
edges.push_back((Edge){to,from,dist});
G[to].push_back(edges.size()-1);
}
Q.push((Node){0,1});
while(!Q.empty()){
Node x=Q.top();Q.pop();
int u=x.u;
if(v[u]) continue;
v[u]=1;
for(int i=0;i<G[u].size();i++){
Edge& e=edges[G[u][i]];
if(d[e.t]>d[u]+e.d){
d[e.t]=d[u]+e.d;
Q.push((Node){d[e.t],e.t});
}
}
}
return 0;
}
图的最短路算法 Dijkstra及其优化的更多相关文章
- (转)最短路算法--Dijkstra算法
转自:http://blog.51cto.com/ahalei/1387799 上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...
- 最短路算法 Dijkstra 入门
dijkstra算法 是一种单源点最短路算法求出一个点到其他所有点的最短路. 给你这样的一个图,需要求出1号点到其他点的最短距离是多少. 首先我们开一个数组 d[N],d[x] 代表着从起点出发到x点 ...
- 10行实现最短路算法——Dijkstra
今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...
- dijkstra最短路算法(堆优化)
这个算法不能处理负边情况,有负边,请转到Floyd算法或SPFA算法(SPFA不能处理负环,但能判断负环) SPFA(SLF优化):https://www.cnblogs.com/yifan0305/ ...
- 图的最短路算法 Bellman-Ford
BF求图的最短路径的时间复杂度是O(MN),这样的时间复杂度并不比迪杰斯特拉算法好,但是BF算法支持图中存在负权的情况,但图中不能存在负圈,因为如果存在负圈,最短路是不存在的,因此BF算法的另一个重要 ...
- 单源最短路——朴素Dijkstra&堆优化版
朴素Dijkstra 是一种基于贪心的算法. 稠密图使用二维数组存储点和边,稀疏图使用邻接表存储点和边. 算法步骤: 1.将图上的初始点看作一个集合S,其它点看作另一个集合 2.根据初始点,求出其它点 ...
- 最短路算法 —— Dijkstra算法
用途: 解决单源最短路径问题(已固定一个起点,求它到其他所有点的最短路问题) 算法核心(广搜): (1)确定的与起点相邻的点的最短距离,再根据已确定最短距离的点更新其他与之相邻的点的最短距离. (2) ...
- 图的最短路算法 Floyd
多源最短路径算法 时间复杂度O(N3) 简单修改可求有向图的传递闭包 #include<iostream> using namespace std; const int maxn=1024 ...
- 图 Graph-图的相关算法
2018-03-06 17:42:02 一.最短路问题 问题描述:在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径. 这条路径就是两点之间的最短路径 (Shortest Path ...
随机推荐
- java学习笔记(二)之数据部分
数据类型 java数据类型 基本数据类型 数值型 整型byte/short/int/long 浮点型/double/float 字符型char 布尔型boolean 取值true f ...
- (C++) Interview in English. - Constructors/Destructors
Constructors/Destructors. 我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成 ...
- Redis 内存使用优化与存储
Redis 常用数据类型 Redis 最为常用的数据类型主要有以下五种: • String • Hash • List • Set • Sorted set 在具体描述这几种数据类型之前,我们先通过一 ...
- html元素的显示和隐藏
div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白: style="visibility: hidden;" document.getElementBy ...
- Hadoop MapReduce编程学习
一直在搞spark,也没时间弄hadoop,不过Hadoop基本的编程我觉得我还是要会吧,看到一篇不错的文章,不过应该应用于hadoop2.0以前,因为代码中有 conf.set("map ...
- Spark1.4启动spark-shell时initializing失败
错误信息如下: 5/11/03 16:48:15 INFO spark.SparkContext: Running Spark version 1.4.1 15/11/03 16:48:15 WARN ...
- POJ 1740 A New Stone Game(普通博弈)
A New Stone Game 题意: 对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆.最后谁无子可取即输 ...
- BestCoder Round #84 Bellovin
Bellovin 题意: 给个中文链接:戳戳戳 题解: 这个题其实就是让你求每一位的最长公共子序列,之后输出就好了,求这个有2个算法,一个是n方,另一个nlogn,所以显然是nlogn的算法,其实这就 ...
- studio-引入外来包
参考: http://stackoverflow.com/questions/16588064/how-do-i-add-a-library-project-to-the-android-studio ...
- DevExpress打印功能 z
一.打印功能说明: 打印功能,我们有多种实现方式,可以根据需要自行选择,我简单的总结下两种方法. (1).使用微软.net框架自带的PrintDocument,这种方式是直接借助Graphics,自行 ...