图的最短路算法 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 ...
随机推荐
- ios5 中文键盘高度变高覆盖现有ui问题的解决方案(获取键盘高度的方法)(转载)
背景: ios5之前,iphone上的键盘的高度是固定为216.0px高的,中文汉字的选择框是悬浮的,所以不少应用都将此高度来标注键盘的高度(包括米聊也是这么做的). 可是在ios5中,键盘布局变了, ...
- 黄聪:VS2010开发T4模版引擎之基础入门
原文:http://www.cnblogs.com/lzrabbit/archive/2012/07/15/2591085.html 额,T4好陌生的名字,和NuGet一样很悲催,不为世人所熟知,却又 ...
- JavaScript正则详谈
JavaScript RegExp 基础详谈 前言: 正则对于一个码农来说是最基础的了,而且在博客园中,发表关于讲解正则表达式的技术文章,更是数不胜数,各有各的优点,但是就是这种很基础的东西,如果 ...
- DBA_Oracle Sort排序处理空间耗用(概念)
2014-12-18 Created By BaoXinjian
- 对Vector3.Lerp 插值的理解
有时,我们在做游戏时会发现有些跟随动作不够圆滑或者需要一个缓冲的效果,这时,一般会考虑到插值.所以对插值的理解是必需的.(比如摄像机跟随主角) 插值是数学上的一个概念,在这里用公式表示就是:from ...
- UCOS-消息邮箱(学习笔记)
任务间数据传递通过缓冲区进行,如果将缓冲区赋值给时间控制块成员:指针OSEventPtr,且任务控制块类型为OS_EVENT_TYPE_MBOS则即为消息邮箱: 一创建消息邮箱:OS_EVENT *O ...
- PHP框架 Laravel Eloquent ORM 批量插入数据 && 批量更新目前没有
foreach ($products as $v=>$a) { $count[] = array('product_name' => $a['name'], 'product_weight ...
- Android牟利之道(一)--界面嵌入有米广告
经过了一番折腾,忙忙碌碌了一下午,终于搞明白了Android软件界面嵌入广告的方法,以下我以嵌入有米广告为例小结一下: 我的新浪微博(wind瑞):http://weibo.com/tianrui19 ...
- 终于有了自己的园子,Happy一下
终于找到了一个比较好的写博客的地方,cnblogs,不错,我想你正是我所需要的功能!这是开山以来的第一篇文章,终于有了自己的园子,Happy一下.
- 20145305 《Java程序设计》第3周学习总结
教材学习内容总结 1."一类一文件" 2.参考名称与对象数据成员同名时,可以在数据成员前使用this区别 3.不能用==直接比较浮点数运算结果 4.=是用在指定参考名称参考某个对象 ...