单源最短路径算法

时间复杂度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. TCP/IP四层模型和OSI七层模型的概念

    转:http://blog.csdn.net/superjunjin/article/details/7841099/ TCP/IP四层模型 TCP/IP是一组协议的代名词,它还包括许多协议,组成了T ...

  2. Python之re模块 —— 正则表达式操作

    这个模块提供了与 Perl 相似l的正则表达式匹配操作.Unicode字符串也同样适用. 正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突, ...

  3. activiti基础操作

    package activitiTest; import java.io.InputStream; import java.util.List; import java.util.zip.ZipInp ...

  4. PHP中的中文截取乱码问题_gb2312_utf-8

    一.字符串编码为gb2312,一个中文占俩字节 public static function chinesesubstr($str, $start, $len) { // $str指字符串,$star ...

  5. 黄聪:WordPress图片插件:Auto Highslide修改版(转)

    一直以来很多人都很喜欢我博客使用的图片插件,因为我用的跟原版是有些不同的,效果比原版的要好,他有白色遮罩层,可以直观的知道上下翻图片和幻灯片放映模式.很多人使用原版之后发现我用的更加帅一些,于是很多人 ...

  6. python入门,猜数

    #this is a sample guess program import random guesses_made =0 name = raw_input('Hello! whats your na ...

  7. Win7+VMware Workstation环境下的CentOS-Linux网络连接设置

    Win7+VMware Workstation环境下的CentOS-Linux网络连接设置 http://blog.sciencenet.cn/blog-430991-507041.html   近日 ...

  8. suibi

    测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等. 我所了解的模块接口测试大体分为两类:模块接口测试和web接口测试 模块接口测试是单元测试的基础.它主要测试模块的调用 ...

  9. 小白也能用Git管理团队项目了:百度云同步+Git Extensions+Git Source Control Provider

    百度云同步 百度云同步,会将本地的某个文件目录和云端进行同步.如果在本地将这个同步的目录设置为Git的中心服务器,那么本地push到中心服务器的内容也会被同步到云端.其他开发者只要也进行相同的设置,就 ...

  10. 文件下载(只需要简单的四步),Java中都通用

    我们就直接切入主题啦,文件下载只需要四步: 1.设置文件ContentType类型 2.设置文件头 3.通过response获取ServletOutputStream对象(out) 4.写到输出流(o ...