• codevs 2602 最短路径问题——良心题解


    2602 最短路径问题

     时间限制: 1 s

     空间限制: 32000 KB

     题目等级 : 黄金 Gold

    题解

    题目描述 Description

    平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。

    输入描述 Input Description

    第一行为整数n。

    第2行到第n+1行(共n行),每行两个整数x和y,描述了一个点的坐标。

        第n+2行为一个整数m,表示图中连线的个数。

        此后的m行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线。

        最后一行:两个整数s和t,分别表示源点和目标点。

    输出描述 Output Description

    仅一行,一个实数(保留两位小数),表示从s到t的最短路径长度。

    样例输入 Sample Input

    5

    0 0

    2 0

    2 2

    0 2

    3 1

    5

    1 2

    1 3

    1 4

    2 5

    3 5

    1 5

    样例输出 Sample Output

    3.41

    数据范围及提示 Data Size & Hint

    分类标签 Tags 点此展开 

    Floyd 最短路 图论

    提交:codevs:http://codevs.cn/problem/2602/

    思路分析:按照输入顺序建立点集,存储点的横纵坐标,图的话因为是Floyd,只能用邻接矩阵(或许是我太蒟了?orz),反正只有100个点,数组开到100*100就够了,因为只需要存储这100个点之间的关系,内存占用大约336KB,不会MLE(空间限制32M)。只有100个点,数据太小了,用FloydO(n)=100^3=1 000 000也不会TLE,关键还是以好写为主嘛。然后se都是编号,只需要在图中寻找就好了。这题关键在于处理好图与点的关系。

    附:不同算法对不同图的适用性(时间复杂度以O=10^8为限,约合1s):

    算法(特性)

    算法复杂度

    极限

    Floyd(慢,适用于负边)

    通值:V^3

    E无关,通值:V<463

    Dijkstra(不能处理负边权)

    期望:V^2

    最差:|E|+|V|log|V|

    E, N均有关,期望:V<9999 最差:V<9998

    SPFA(对于稠密图退化为Bellman - Ford算法)

    期望:kEk为常数,常见为2)最差:|V|*|E|

    V, E均有关,期望:V<5^7 最差:V<463

    注:可以生成数据专门卡SPFA,如超稠密图、网格图等等,此时k会变得非常大,SPFA算法非常慢(|V|*|E|,等同于Floyd)。所以说SPFA算法是一种非常不稳定的算法(想要推翻前述观点请证明k的取值范围)。以下为维基百科原话:

    以下是构建数据以破坏该算法的方法(不使用队列优化)。假设要求从顶点1到顶点n的最短路径。然后,我们可以用1i<n的小随机权重来添加边(ii + 1)(因此最短路径应为1-2 -...n),并随机添加4n个其他重边。对于这种情况,所谓的SPFA算法将非常慢。

    附:两篇国家队论文,供有能力并且有兴趣的同学看看,内容主要是对于最短路算法优化的讨论(感谢jbyyym两位前辈!):

    SPFA算法的优化及应用(by jby)

    https://wenku.baidu.com/view/9e1231126edb6f1aff001f25.html

    最短路算法及其应用(by yym)

    https://wenku.baidu.com/view/7b2134c30c22590102029d27.html

    (当然省选阶段前卡SPFA算法的题目是很少的,但还是要熟记Dijkstra算法,毕竟是一种十分稳定的算法,并且堆优化后跑得很快。要注意数据范围,大数据直接上SPFA;数据在10^4数量级上,保险起见还是用Dijkstra算法。)

    代码(如果看不清楚就调整缩放比例到150%吧):

    来一波数据黑一下SPFA

    (I). 数据

    1000 999000

    1 2 1

    1 3 1

    1 1000 1

    2 1 1

    999 1000 1

    1 1000

     

    (数据量:10.2M)

    (II). 实测:

    略,这是SPFA的最差情况——完全图。

  • 相关阅读:
    支持stl容器的gdb自定义命令
    Thrift辅助类,用于简化Thrift编程
    Linux上获取CPU Core个数的实现
    第54课 被遗弃的多重继承(下)
    第53课 被遗弃的多重继承(上)
    第52课 C++中的抽象类和接口
    第51课 C++对象模型分析(下)
    第50课 C++对象模型分析(上)
    第49课 多态的概念和意义
    第48课 同名覆盖引发的问题
  • 原文地址:https://www.cnblogs.com/TheRoadToAu/p/6725096.html
Copyright © 2020-2023  润新知