浅谈《最短路》问题(一)

最短路问题1.1

by MPS

----------------------------------------------------------------------------------------------------------------------------------------------------------

1.1.1绪论

临近NOIP复赛之前,特地来复习一下NOIP的图论知识章节的最主要的一个章节——最短路。

最短路分为单源最短路和多源最短路,通常我们对求解单源最短路的算法有Dijkstra,SPFA,Bellman-Ford,而对多源最短路的求法有Floyd和Jhonson

在1.1内,只介绍Dijkstra和Floyd,预知后事如何,请继续关注蒟蒻MPS的博客

----------------------------------------------------------------------------------------------------------------------------------------------------------

 1.1.2 单源最短路的求解算法——Dijkstra算法

我们对于给定源点,且有且只有一个源点的图叫做单源图,而求解源点到终点的最短路径则叫做单源最短路。

较为著名的算法就是Dijkstra算法

Dijkstra算法的流程如下:(可以类比Prim方便理解)

1.已知一个开放列表和一个关闭列表,开放表示已经处理过的点,关闭表示尚未处理的点,一开始,我们把源点放入开放列表,其余点放入关闭列表

2.我们从开放列表里的第一个且未被执行的点开始,选择与其最近的点,将点从关闭列表放入开放列表,然后松弛这个点能到达的点到源点的距离

3.重复2  n次

很容易看出,重复的时间复杂度为O(n),选择最近的点为O(n),松弛为O(n),则实际上Dij的时间复杂度为O(n(n+n))

但不过我们可以近似看成O(n^2)

1.1.2.1 练习模板题——HDU 2544 《最短路》  

Problem Description

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

Input

输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。

输入保证至少存在1条商店到赛场的路线。

Output

对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间

Sample Input

2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0

Sample Output

3
2

很明显,设测试数据组数为T,则题目是要我们跑T遍dijkstra

所以很简单了= =

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int MaxN=101;
const int INF=0x7fffffff;

int n,m,dis[MaxN],map[MaxN][MaxN];
bool vis[MaxN];

void dijkstra(){
	dis[1]=0;
	int i,j,k,cost;
	for(i=2;i<=n;i++)dis[i]=INF;
	memset(vis,false,sizeof(vis));
	for(i=1;i<=n;i++){
		cost=INF;
		for(j=1;j<=n;j++)
		  if(vis[j]==false && cost>dis[j])
		    {cost=dis[j];k=j;}
		vis[k]=true;
		for(j=1;j<=n;j++)
		  if(vis[j]==false && dis[j]>dis[k]+map[k][j] && map[k][j]!=0)
		    dis[j]=dis[k]+map[k][j];
	}
}

int main(){
  scanf("%d %d",&n,&m);
  int i,j,u,v,cap;
  while(n!=0 && m!=0){
  	memset(map,0,sizeof(map));
  	for(i=1;i<=m;i++){
  		scanf("%d %d %d",&u,&v,&cap);
  		map[u][v]=map[v][u]=cap;
  	}
	dijkstra();
  	printf("%d\n",dis[n]);
  	scanf("%d %d",&n,&m);
  }
  return 0;
}

--------------------------------------------------------------------------------------------------------------------------------------------------------

 1.1.2.2 Dijkstra算法的反思

 dijkstra算法的时间复杂度O(n^2),那么,有没有可以优化的地方呢?显然是有的。就是在算法流程的第二步:

选出最近点

我们可以用小根堆优化,这样就把O(N^2)降低为了O((n+m)logn)

比较偷懒的Oier(类如我)直接用优先队列也是个不错的选择

代码略

--------------------------------------------------------------------------------------------------------------------------------------------------------

1.1.3 多源最短路的求解算法——Floyd_Warshall算法

对于稠密图的多源最短路(说白了就是点对点的最短路)的求解方法,我们一般使用floyd算法

floyd其实是一个动态规划的算法

我们这样划分阶段:以每一次松弛划分阶段

状态:f[i][j]表示i到j的最短路

动态转移方程:f[i][j]=min(f[i][j],f[i][k]+f[k][j])   (1<=i,j,k<=n)

那么具体代码就出来了,时间复杂度显然是O(N^3)

较于简单,读者自行理解→_→

--------------------------------------------------------------------------------------------------------------------------------------------------------

Thanks for watching!

时间: 2024-08-05 11:41:08

浅谈《最短路》问题(一)的相关文章

浅谈k短路算法

An Old but Classic Problem 给定一个$n$个点,$m$条边的带正权有向图.给定$s$和$t$,询问$s$到$t$的所有权和为正路径中,第$k$短的长度. Notice 定义两条路径不同,当且仅当它们的边集中存在一条边,使得它只在其中的一条路径上. Solution#1 Shortest Path & A* 对于Dijstra算法,有一个结论就是,当一个点第$k$次出队的时候,此时路径长度就是$s$到它的第$k$短路. 那为什么还要A*呢?我试了试,写了个Dijstra,

浅谈差分约束系统——图论不等式的变形

浅谈差分约束系统——图论不等式的变形 ----yangyaojia 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! 一.定义 如若一个系统由n个变量和m个不等式组成,并且这m个不等式对应的系数矩阵中每一行有且仅有一个1和-1,其它的都为0,这样的系统称为差分约束( difference constraints )系统. 二.分析 简单来说就是给你n个变量,给m个形如x[i]-x[j]≥k①或x[i]-x[j]≤k②.求两

浅谈建材类型的网站应该选择哪些有效的外链平台

随着互联网的发展,SEO行业在不断的被人们所熟知,从一个普通的公司到一个中小型的企业都在使用SEO来优化网站,可想而知SEO这门技术已经被企业所重视,近期,笔者一直在负责优化建材类型的企业网站,从结构优化到页面优化到内容优化再到外链建设这块,笔者总结出了不少经验心得,然而对外链这方面因百度绿萝算法让笔者优化的思路出现了短路,后来跟一些同行的站长们交流了下并实战了下,发现对建材类网站的效果不错,然后总结出了四个对外链建设有用的方法,下面就由笔者跟各位建材网站的站长们浅谈下建材类型的网站应该选择哪些

从window.console&amp;&amp;console.log(123)浅谈JS的且运算逻辑(&amp;&amp;)

从window.console&&console.log(123)浅谈JS的且运算逻辑(&&) 作者:www.cnblogs.com  来源:www.cnblogs.com  发布日期:2015-03-01 一.JS的且运算记得最开始看到window.console&&console.log(123),当时知道能起什么作用但是没有深入研究,最近在研究后总算弄明白了.要理解这个,首先得明白三个知识点第一:短路原则这个大家都非常清楚的了,在做且运算的时候,“同真

前端进击的巨人(八):浅谈函数防抖与节流

本篇课题,或许早已是烂大街的解读文章.不过春招系列面试下来,不少伙伴们还是似懂非懂地栽倒在(-面试官-)深意的笑容之下,权当温故知新. JavaScript的执行过程,是基于栈来进行的.复杂的程序代码被封装到函数中,程序执行时,函数不断被推入执行栈中.所以 "执行栈" 也称 "函数执行栈". 函数中封装的代码块,一般都有相对复杂的逻辑处理(计算/判断),例如函数中可能会涉及到 DOM 的渲染更新,复杂的计算与验证, Ajax 数据请求等等. 前端页面的操作权,大部分

.net中对象序列化技术浅谈

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化

浅谈——页面静态化

现在互联网发展越来越迅速,对网站的性能要求越来越高,也就是如何应对高并发量.像12306需要应付上亿人同时来抢票,淘宝双十一--所以,如何提高网站的性能,是做网站都需要考虑的. 首先网站性能优化的方面有很多:1,使用缓存,最传统的一级二级缓存:2,将服务和数据库分开,使用不同的服务器,分工更加明确,效率更加高:3,分布式,提供多台服务器,利用反向代理服务器nginx进行反向代理,将请求分散开来:4,数据库的读写分离,不同的数据库,将读操作和写操作分开,并实时同步即可:5,分布式缓存,使用memc

单页应用SEO浅谈

单页应用SEO浅谈 前言 单页应用(Single Page Application)越来越受web开发者欢迎,单页应用的体验可以模拟原生应用,一次开发,多端兼容.单页应用并不是一个全新发明的技术,而是随着互联网的发展,满足用户体验的一种综合技术. SEO 一直以来,搜索引擎优化(SEO)是开发者容易忽略的部分.SEO是针对搜索(Google.百度.雅虎搜索等)在技术细节上的优化,例如语义.搜索关键词与内容相关性.收录量.搜索排名等.SEO也是同行.市场竞争常用的的营销手段.Google.百度的搜

浅谈html标签

浅谈html各常用标签用法 标题标签:<h1>-<h6>来表示,使标题字体变粗. <br />换行标记 <hr />水平分隔符 &nbsp空格符 &copy版权符 <a href>a标签超链接 href可接链接地址 <p>段落标签<blockquote>引用标签及可用做缩进 <table>表格中的<ul>无序列表<ol>有序列表<dl>自定义列表<row

浅谈二维中的树状数组与线段树

一般来说,树状数组可以实现的东西线段树均可胜任,实际应用中也是如此.但是在二维中,线段树的操作变得太过复杂,更新子矩阵时第一维的lazy标记更是麻烦到不行. 但是树状数组在某些询问中又无法胜任,如最值等不符合区间减法的询问.此时就需要根据线段树与树状数组的优缺点来选择了. 做一下基本操作的对比,如下图. 因为线段树为自上向下更新,从而可以使用lazy标记使得矩阵的更新变的高校起来,几个不足就是代码长,代码长和代码长. 对于将将矩阵内元素变为某个值,因为树状数组自下向上更新,且要满足区间加法等限制