一般的dijkstra算法利用贪心的思想,每次找出最短边,然后优化到其他点的的距离,我们还采用贪心思路,但在寻找最短边进行优化,之前是双重for循环,现在我们用优先队列来实现。

代码解释:

//样例程序采用边表储存。

#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<iostream>

using namespace std;

int head[100000]={0},next[200000]={0},aa[200000]={0},size,s,tt,m,n;

struct bb
{
int x,y;
}a[100000];//记录点的横纵坐标。
double val[100000],dis[100000]={0};

void add(int h,int t,double c)//建立边表。
{
size++;//对边进行重编号。
next[size]=head[h];
head[h]=size;
aa[size]=t;
val[size]=c;
}

void init()
{
scanf("%d",&n);
for (int i=0;i<n;i++)
{
int u,v;
double c;
scanf("%d%d",&u,&v); //读入有边的两点。
c=sqrt((a[u-1].x-a[v-1].x)*(a[u-1].x-a[v-1].x)+(a[u-1].y-a[v-1].y)*(a[u-1].y-a[v-1].y));//用数学公式求出两点间距离。
add(u,v,c);//建立由u到v的边,权值为c;
add(v,u,c);//若图为有向图,则省略该语句。
}
scanf("%d%d",&s,&tt); //读入所求的由s到tt的距离。目标。
}

void initint()//存下点的坐标。
{
scanf("%d",&m);
for (int i=0;i<m;i++)
scanf("%d%d",&a[i].x,&a[i].y);
}

struct ss//定义优先队列的自定义结构体。
{
int x;
double y;
ss(){}//定义构造函数。
ss(int xx,double yy)//重载该函数。
{
x=xx;
y=yy;
}

bool operator<(const ss& b)const//重载<运算符(因为我们要找最小值,而优先队列默认为大根堆)。
{
return y>b.y;
}
};

void dij()//dijkstra算法
{
priority_queue<ss>que;//定义优先队列,不懂看“C++之路启航——标准模板库(queue)”
que.push(ss(s,0));//把起点压入队列中。
for (int i=0;i<=m;i++)//
dis[i]=100000000;
dis[s]=0;// 初始操作。
while (!que.empty())
{
ss op=que.top();//取出最小值。op.x为点的编号,op.y为从起点到该点的距离。
que.pop();
if (op.y>dis[op.x]) continue;//一步优化。
for (int i=head[op.x];i!=0;i=next[i]) //遍历与该点相连的边。
{
int j=aa[i];
if (dis[j]>dis[op.x]+val[i])//找到能够更新的,并且压入队列中。
{
dis[j]=dis[op.x]+val[i];
que.push(ss(j,dis[j]));
}
}
}
printf("%.2f",dis[tt]);//输出;
return;
}

int main()
{
initint();
init();
dij();
return 0;
}

C++之路进阶——优先队列优化最短路径算法(dijkstra)的更多相关文章

  1. 最短路径算法Dijkstra和A*

    在设计基于地图的游戏,特别是isometric斜45度视角游戏时,几乎必须要用到最短路径算法.Dijkstra算法是寻找当前最优路径(距离原点最近),如果遇到更短的路径,则修改路径(边松弛). Ast ...

  2. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  3. 有向有权图的最短路径算法--Dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  4. 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson

    根据DSqiu的blog整理出来 :http://dsqiu.iteye.com/blog/1689163 PS:模板是自己写的,如有错误欢迎指出~ 本文内容框架: §1 Dijkstra算法 §2 ...

  5. 图论最短路径算法——Dijkstra

    说实在的,这算法很简单,很简单,很简单--因为它是贪心的,而且码量也小,常数比起SPFA也小. 主要思想 先初始化,dis[起点]=0,其它皆为无限大. 还要有一个bz数组,bz[i]表示i是否确定为 ...

  6. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

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

    在路由选择算法中都要用到求最短路径算法.最出名的求最短路径算法有两个,即Bellman-Ford算法和Dijkstra算法.这两种算法的思路不同,但得出的结果是相同的. 下面只介绍Dijkstra算法 ...

  8. 最短路径算法——Dijkstra算法与Floyd算法

    转自:https://www.cnblogs.com/smile233/p/8303673.html 最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2  ...

  9. 优先队列优化dij算法

    之前已经弄过模板了,但那个复杂一点,这个就是裸的dij,用起来更方便 输入格式:n,m,s,d分别是点数,边数,起点,终点 之后m行,输入x,y,z分别是两点即权值 题目链接:https://www. ...

随机推荐

  1. 【转】JavaScript中的this关键字使用的四种调用模式

    http://blog.csdn.net/itpinpai/article/details/51004266 this关键字本意:这个.这里的意思.在JavaScript中是指每一个方法或函数都会有一 ...

  2. 实验三--for语句及分支结构else-if

    本节课学习到的知识点: 1.for语句的表达式的应用与掌握.流程形式. 2.多分支else-if,用来判断真假等. 实验中遇到的问题及解决方法: 这次课的逻辑要求比之前的课要难许多,而且对于一些数学逻 ...

  3. 蓝牙的SDP协议总结

    1.概念     SDP协议让客户机的应用程序发现存在的服务器应用程序提供的服务以及这些服务的属性.SDP只提供发现服务的机制,不提供使用这些服务的方法.每个蓝牙设备都需要一个SDP Service, ...

  4. 三种查看SqlServer中数据物理pge页的方法

    1.根据数据记录查看当前记录所在的文件编号.page页.以及在页中的插槽. 示例如下: SELECT top %%physloc%%, sys.fn_physlocFormatter (%%physl ...

  5. WPF自定义RoutedEvent事件示例代码

    ************************* 引用网友,便于查找所用..... 创建自定义路由事件和应用分为6个步骤: (1)自定义路由事件参数对象 (2)声明并注册路由事件 (3)为路由事件添 ...

  6. 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释

    在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时 会产生Additional information: 阅读器关闭时尝试调用 ...

  7. Excel导入数据到Sql server 中出错:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”

    从Excel导入数据到Sql server 时,由于表中的数据有的很长,导入时出现如下错误(如果数据不是很长,255内以内,则不会出现错误): 出错原因: SQL Server的导入导出为了确定数据表 ...

  8. logback配置详解(二)

    <appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的组件. <appende ...

  9. python笔记 - day4-之装饰器

                 python笔记 - day4-之装饰器 需求: 给f1~f100增加个log: def outer(): #定义增加的log print("log") ...

  10. 从printf("\40d\n")看转义字符

    1.  八进制  十进制  十六进制 二进制:0 1 2 3 4 5 6 7    \0(或省略0,\) ,\28 按道理是错误的,但是C语言把它解释为 \2,8错误了就不考虑 十进制:0 1 2 3 ...