单源最短路径算法

时间复杂度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及其优化的更多相关文章

  1. (转)最短路算法--Dijkstra算法

    转自:http://blog.51cto.com/ahalei/1387799         上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...

  2. 最短路算法 Dijkstra 入门

    dijkstra算法 是一种单源点最短路算法求出一个点到其他所有点的最短路. 给你这样的一个图,需要求出1号点到其他点的最短距离是多少. 首先我们开一个数组 d[N],d[x] 代表着从起点出发到x点 ...

  3. 10行实现最短路算法——Dijkstra

    今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...

  4. dijkstra最短路算法(堆优化)

    这个算法不能处理负边情况,有负边,请转到Floyd算法或SPFA算法(SPFA不能处理负环,但能判断负环) SPFA(SLF优化):https://www.cnblogs.com/yifan0305/ ...

  5. 图的最短路算法 Bellman-Ford

    BF求图的最短路径的时间复杂度是O(MN),这样的时间复杂度并不比迪杰斯特拉算法好,但是BF算法支持图中存在负权的情况,但图中不能存在负圈,因为如果存在负圈,最短路是不存在的,因此BF算法的另一个重要 ...

  6. 单源最短路——朴素Dijkstra&堆优化版

    朴素Dijkstra 是一种基于贪心的算法. 稠密图使用二维数组存储点和边,稀疏图使用邻接表存储点和边. 算法步骤: 1.将图上的初始点看作一个集合S,其它点看作另一个集合 2.根据初始点,求出其它点 ...

  7. 最短路算法 —— Dijkstra算法

    用途: 解决单源最短路径问题(已固定一个起点,求它到其他所有点的最短路问题) 算法核心(广搜): (1)确定的与起点相邻的点的最短距离,再根据已确定最短距离的点更新其他与之相邻的点的最短距离. (2) ...

  8. 图的最短路算法 Floyd

    多源最短路径算法 时间复杂度O(N3) 简单修改可求有向图的传递闭包 #include<iostream> using namespace std; const int maxn=1024 ...

  9. 图 Graph-图的相关算法

    2018-03-06 17:42:02 一.最短路问题 问题描述:在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径. 这条路径就是两点之间的最短路径 (Shortest Path ...

随机推荐

  1. 【freemaker】之自定义变量,特殊变量 globals ,循环对象取值

    entity public class Employee { private Integer id; private String name; private Integer age; private ...

  2. CentOS7安装Oracle 11g R2 详细过程——零基础

    本人linux小白,因项目原因必须要在linux下使用oracle便开始了探索.安装过程中遇到了种种问题与原因,今天整理一下方便后面的可以少走弯路. *注明: 安装过程注意当前错作的用户,执行./ru ...

  3. Ubuntu下面配置问题

    下开启root登陆 sudo passwd root 输入两次新密码 就能在虚拟终端下用 root登陆了,或者 su到root用户了. ctrl + alt +t 弹出终端 ctrl+ alt+ f7 ...

  4. 进程间的通讯(IPC)方式

    内存映射 为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间共享数据 ...

  5. 黄聪:Discuz!X3.2 如何配置超级版主或者某些管理员,允许管理用户组或者权限

    点击后台-->站长-->后台管理团队-->新增用户(用户名)用户管理员即可

  6. canvas刮刮乐

    这周有点迷茫,不知道干嘛了,一天天就过去了!我在博客右侧公告栏加了qq交流,各位有好的主题,或者有趣的技术,欢迎交流!今天突发奇想,就写了2个h5 canvas的demo玩玩! demo一:刮刮乐 舍 ...

  7. Hadoop MapReduce编程学习

    一直在搞spark,也没时间弄hadoop,不过Hadoop基本的编程我觉得我还是要会吧,看到一篇不错的文章,不过应该应用于hadoop2.0以前,因为代码中有  conf.set("map ...

  8. Scala第一章学习笔记

    面向对象编程是一种自顶向下的程序设计方法.用面向对象方法构造软件时,我们将代码以名词(对象)做切割,每个对象有某种形式的表示服(self/this).行为(方法).和状态(成员变量).识别出名词并且定 ...

  9. 2016 Multi-University Training Contest 5 Divide the Sequence

    Divide the Sequence 题意: 给你一个序列A,问你最多能够分成多少个连续子序列,使得每个子序列的所有前缀和均不小于0 题解: 这题是比赛时候的水题,但我比的时候也就做出这一题, = ...

  10. hdu 1561 The more, The Better 背包型树形DP 简单题

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...