单源最短路径算法

时间复杂度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. rsync 同步文件

    rsync 同步文件 rsync -avz roo@192.168.4.12::/home/a ./a  --exclude "data" exclude 去掉/a/data 文件 ...

  2. MEF简单示例

    原文地址: http://www.cnblogs.com/xiaokang088/archive/2012/02/21/2361631.html MEF 的精髓在于插件式开发,方便扩展. 例如,应用程 ...

  3. hive查询语句

    一. 为什么hive是数据仓库 hive局限于hdfs, 不能进行记录级别的增删改 hive底层的mapreduce启动耗时很长, 无法做到传统数据库的秒查, 只适合离线分析 hive不支持事务, 无 ...

  4. Instant Run

    http://tools.android.com/tech-docs/instant-run N Developer Preview users: Instant Run is currently i ...

  5. Educational Codeforces Round 15 Powers of Two

    Powers of Two 题意: 让求ai+aj=2的x次幂的数有几对,且i < j. 题解: 首先要知道,排完序对答案是没有影响的,比如样例7 1一对,和1 7一对是样的,所以就可以排序之后 ...

  6. queue 与 vector

    优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序 每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储. 例如:我们常用的操作就 ...

  7. Python补充01 序列的方法

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在快速教程中,我们了解了最基本的序列(sequence).回忆一下,序列包含有定值 ...

  8. oc 中随机数的用法(arc4random( ) 、random( )、CCRANDOM_0_1( )

    来源:http://www.cnblogs.com/jay-dong/archive/2012/07/23/2604916.html 1).arc4random() 比较精确不需要生成随即种子 使用方 ...

  9. 全文检索引擎Solr系列—–全文检索基本原理

    场景:小时候我们都使用过新华字典,妈妈叫你翻开第38页,找到“坑爹”所在的位置,此时你会怎么查呢?毫无疑问,你的眼睛会从38页的第一个字开始从头至尾地扫描,直到找到“坑爹”二字为止.这种搜索方法叫做顺 ...

  10. gomobile 真机 log 打出的日志跟踪

    go mobile 开发的应用,真机调试时,我们期望看到log包打出的日志, 这时候就需要借用 Android Device Monitor 了. 我们的 go 代码中用最简单的 log.Printl ...