精华内容
下载资源
问答
  • 记录下 java jts 求个空间几何图形间最短距离,及最短距离间个坐标. 如:求一个到一条直线的垂直坐标
  • 本次程序利用邻接表实现无向图,并且通过广度优先遍历找到两点之间的最短路径。 2.广度优先遍历 广度优先遍历(BFS)和深度优先遍历(DFS)是图结构中最常用的遍历方式。其中广度优先遍历配合上队列能够找到两点之间的...
  • 主要为大家详细介绍了python广度优先搜索得到两点间最短路径,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • -1), k=1) # distance to first nearest station 100 loops, best of 3: 1.79 ms per loop 方法2合并个数据帧%%timeit properties['key'] = 1 stations['key'] = 1 df = properties.merge(stations,on='key') del...

    使用BallTree from Sklearn,它提供了一种更快的查找最近邻居的方法import numpy as np

    import pandas as pd

    from sklearn.neighbors import KDTree, BallTree

    properties=pd.DataFrame({'propertyID':['13425','32535','43255','52521'],

    'lat':[-37.79230,-37.86400,-37.85450,-37.71870],

    'lon':[145.10290,145.09720,145.02190,144.94330]})

    stations=pd.DataFrame({'stationID':['11','33','21','34','22'],

    'lat':[-37.416861,-37.703293,-37.729261,-37.777764,-37.579206],

    'lon':[145.005372,144.572524,144.650631,144.772304,144.728165]})

    property_coords = properties.as_matrix(columns=['lat', 'lon'])

    station_coords = stations.as_matrix(columns=['lat', 'lon'])

    # Create BallTree using station coordinates and specify distance metric

    tree = BallTree(station_coords, metric = 'haversine')

    print('PropertyID StationID Distance')

    for i, property in enumerate(property_coords):

    dist, ind = tree.query(property.reshape(1, -1), k=1) # distance to first nearest station

    print(properties['propertyID'][i], stations['stationID'][ind[0][0]], dist[0][0], sep ='\t')

    输出

    ^{pr2}$

    性能

    Summary BallTree&比合并数据帧的方法快5倍

    详细信息(假设预加载库和数据)

    方法1使用BallTree%%timeit

    property_coords = properties.as_matrix(columns=['lat', 'lon'])

    station_coords = stations.as_matrix(columns=['lat', 'lon'])

    # Create BallTree using station coordinates and specify distance metric

    tree = BallTree(station_coords, metric = 'haversine')

    for i, property in enumerate(property_coords):

    dist, ind = tree.query(property.reshape(1, -1), k=1) # distance to first nearest station

    100 loops, best of 3: 1.79 ms per loop

    方法2合并两个数据帧%%timeit

    properties['key'] = 1

    stations['key'] = 1

    df = properties.merge(stations,on='key')

    del df['key']

    df['distance'] = df.apply(lambda x: haversine(x['lon_x'],x['lat_x'],x['lon_y'],x['lat_y']),axis=1)

    #print(df)

    df = df.loc[df.groupby("propertyID")["distance"].idxmin()]

    df = df[['stationID','propertyID']]

    100 loops, best of 3: 10 ms per loop

    展开全文
  • NULL 博文链接:https://128kj.iteye.com/blog/1689015
  • 能求出任意两点间所有最短路径。数模时编写。考虑邻接矩阵中主对角线数据(虽然一般情况都取零)。更具实用性 能求出任意两点间所有最短路径。数模时编写。考虑邻接矩阵中主对角线数据(虽然一般情况都取零)。更具...
  • 任意两点间最短距离,使用动态规划算法实现
  • postgreSQL数据库用pgRouting求两点间最短路径,详细描述操作步骤,直接复制可用
  • 最短路径(图中两点间最短路径)

    千次阅读 2020-12-24 11:13:34
    importjava.util.Scanner;//最短路径求解public classDistMin {static classGraphMatrix{static final int MaxNum=20;char[] Vertex=new char[MaxNum]; //保存顶点信息(序号或字母)int GType; //图的类型(0:...

    packagecom.cn.datastruct;importjava.util.Scanner;//最短路径求解

    public classDistMin {static classGraphMatrix{static final int MaxNum=20;char[] Vertex=new char[MaxNum]; //保存顶点信息(序号或字母)

    int GType; //图的类型(0:无向图,1:有向图)

    int VertexNum; //顶点的数量

    int EdgeNum; //边的数量

    int[][] EdgeWeight=new int[MaxNum][MaxNum]; //保存边的权

    int[] isTrav=new int[MaxNum]; //遍历标志

    }static final int MaxValue=65535; //最大值(可设为一个最大整数)

    static int[] path=new int[GraphMatrix.MaxNum]; //两点经过的顶点集合的数组

    static int[] tmpvertex=new int[GraphMatrix.MaxNum]; //最短路径的起始点集合

    static Scanner input=newScanner(System.in);//创建邻接矩阵图

    static voidCreateGraph(GraphMatrix GM){inti,j,k;int weight; //权

    char EstartV,EendV; //边的起始顶点

    System.out.printf("输入图中各顶点信息\n");for(i=0;i

    System.out.printf("第%d个顶点:", i+1);

    GM.Vertex[i]=(input.next().toCharArray())[0]; //保存到各顶点的数组元素中

    }

    System.out.printf("输入构成各边的顶点及权值:\n");for(k=0;k

    System.out.printf("第%d条边:", k+1);

    EstartV=input.next().charAt(0);

    EendV=input.next().charAt(0);

    weight=input.nextInt();for(i=0;EstartV!=GM.Vertex[i];i++); //在已有顶点中查找始点

    for(j=0;EendV!=GM.Vertex[j];j++); //在已有的顶点中查找终点

    GM.EdgeWeight[i][j]=weight; //对应位置保存权值,表示有一条边

    if(GM.GType==0){ //若是无向图

    GM.EdgeWeight[j][i]=weight; //在对角位置保存权值

    }

    }

    }//清空矩阵

    static voidClearGraph(GraphMatrix GM) {inti, j;for (i = 0; i < GM.VertexNum; i++) {for (j = 0; j < GM.VertexNum; j++) {

    GM.EdgeWeight[i][j]= MaxValue; //设置矩阵中各元素的值为MaxValue

    }

    }

    }//输出邻接矩阵

    static voidOutGraph(GraphMatrix GM) {inti, j;for (j = 0; j < GM.VertexNum; j++) {

    System.out.printf("\t%c", GM.Vertex[j]); //在第一行输出顶点信息

    }

    System.out.println();for (i = 0; i < GM.VertexNum; i++) {

    System.out.printf("%c", GM.Vertex[i]);for (j = 0; j < GM.VertexNum; j++) {if (GM.EdgeWeight[i][j] == MaxValue) { //若权值为最大值

    System.out.printf("\tZ"); //以Z表示无穷大

    } else{

    System.out.printf("\t%d", GM.EdgeWeight[i][j]); //输出边的权值

    }

    }

    System.out.println();

    }

    }//最短路径算法

    static void distMin(GraphMatrix GM,int vend){ //vend为结束点

    int[] weight=new int[GraphMatrix.MaxNum]; //某终止点到各顶点的最短路径长度

    inti,j,k,min;

    vend--;for(i=0;i

    weight[i]=GM.EdgeWeight[vend][i];

    }for(i=0;i

    if(weight[i]0){ //有效权值

    path[i]=vend;

    }

    }for(i=0;i

    tmpvertex[i]=0; //初始化顶点集合为空

    }

    tmpvertex[vend]=1; //选入顶点vend

    weight[vend]=0;for(i=0;i

    min=MaxValue;

    k=vend;for(j=0;j

    min=weight[j];

    k=j;

    }

    }

    tmpvertex[k]=1; //将顶点k选入

    for(j=0;j

    if(tmpvertex[j]==0&&weight[k]+GM.EdgeWeight[k][j]

    weight[j]=weight[k]+GM.EdgeWeight[k][j];

    path[j]=k;

    }

    }

    }

    }public static voidmain(String[] args) {

    GraphMatrix GM=new GraphMatrix(); //定义保存邻接表结构的图

    String go;intvend;inti,k;

    System.out.println("求解最短路径问题!");do{

    System.out.print("请先输入生成图的类型:");

    GM.GType=input.nextInt(); //图的种类

    System.out.print("请输入图的顶点数量:");

    GM.VertexNum=input.nextInt(); //输入图中顶点数

    System.out.print("请输入图的边的数量:");

    GM.EdgeNum=input.nextInt(); //输入图中边数

    ClearGraph(GM); //清空图

    CreateGraph(GM); //生成邻接表结构的图

    System.out.print("\n请输入结束点:");

    vend=input.nextInt();

    distMin(GM,vend);

    vend--;

    System.out.printf("\n个顶点到达顶点%c的最短路径分别为(起始点-结束点):\n",GM.Vertex[vend]);for(i=0;i

    if(tmpvertex[i]==1){

    k=i;while(k!=vend){

    System.out.printf("顶点%c-", GM.Vertex[k]);

    k=path[k];

    }

    System.out.printf("顶点%c\n", GM.Vertex[k]);

    }else{

    System.out.printf("%c-%c:无路径\n", GM.Vertex[i],GM.Vertex[vend]);

    }

    }

    System.out.println("\n继续玩吗(y/n)?");

    go=input.next();

    }while(go.equalsIgnoreCase("y"));

    System.out.println("游戏结束!");

    }

    }

    展开全文
  • (Java)求顶点间最短路径和距离 在网上查看了一些博客,发现他们的代码都有些问题,于是自己重新写了一个,有一定注释
  • 主要为大家详细介绍了JS实现深度优先搜索求解两点间最短路径,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 最短路径-任意两点间最短距离-Floyd算法的matlab实现(详细教程) 目录 简介 核心思路 优缺点分析 算法过程 简介 Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的...

    目录

    简介

    核心思路

    优缺点分析

    算法过程

             示例


    简介

    Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

    核心思路

    路径矩阵

    通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 [3] 

    从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。

    采用松弛技术(松弛操作),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3);

    状态转移方程

    状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};

    map[i,j]表示i到j的最短距离,K是穷举i,j的断点,map[n,n]初值应该为0,或者按照题目意思来做。

    当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路。

    优缺点分析

    编辑 语音

    Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行|V|次SPFA算法

    优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。

    缺点:时间复杂度比较高,不适合计算大量数据

    算法过程

     在Floyd算中一般会用到有两个矩阵,一个距离矩阵D一个路由矩阵R,顾名思义距离矩阵D是用来储存任意两点之间的距离的,而路由矩阵则是用来记录任意两点之间的路径关系。  

    Floyd算法的原理是:对于每一对顶点 i 和 j,看看是否存在一个顶点 w 使得从 i 到 w 再到 j 比已知的路径更短。如果是更新它。

    把图用邻接矩阵r表示出来,如果从Vi到Vj有路可达,则D[i,j]=d(在矩阵D中为具体的数字),d表示该路的长度;否则D[i,j]=无穷大(在矩阵D中用“inf“表示)。定义一个矩阵D用来记录所插入点的信息,R[I,j]表示从Vi到Vj需要经过的点,初始化R[i,j]=j(即先默认i到j是通的)。把各个顶点插入图中,比较插点后的距离与原来的距离,假设插入的中间点为k,D[i,j] > D[i,k]+D[k,j] ),此时证明从i点经过k点再到j点比原来的要短,所以此时要更新D[i,j],则D[i,j]=D[I,k]+[k,j],同时此时R[i,j]=k。在R中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。

    可能有些人对路由矩阵R不是很明白,其实路由矩阵R很好理解,我来举个例子,

    比如,要寻找从V5到V1的路径。根据R,假如 R(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果R(5,3)=3,说明V5与V3直接相连,如果R(3,1)=1,说明V3与V1直接相连。

    因此,我们在定义路由矩阵R时,先要初始化矩阵(即先默认任意两点是相互相通的),即每列上的数等于该列的列序数。

    例:

    V1V2V3V4  ****Vn
    V11234****n
    V21234****n
    V31234****n
    V41234****n
    ****1234****n
    Vn1234****n


    示例

    下面我将用一个简单的例子来说明,下面是一个简单的例子:

    问题:求出任意两点间的最短距离及其路径?

    我们此时可以写出距离矩阵D和路由矩阵R如下:

     

    这样我们就定义好了距离矩阵路由矩阵,现在我们再来假设图中任意两点之间都要经V5这个点中转。算出经过中转后的两点之间的距离,然后我们再来判断任意两点之间的最短距离。
    (1)先从V5开始,先让V5成为中转点。

    V5由V5中转,那么V5到到各个点的距离还是不变。

    V4可以经由V5中转,那么这个时候判断一下中转前和中转后的距离大小,将最小距离留存下来如:

    V4>V3 经V5中转,原来V4->V3 = inf,经由V5中转之后V4->V5->V3 = 17, 于是V4到V3的最短距离变化为17,更新距离矩阵D(4,3)=17,更新路由矩阵R(4,3) = R(4,5) = 5

    V1、V2、V3没有到达V5的路径,所以也就不存在从V5中转的情况,所以V1、V2、V3到各个点的距离还是不变。

    这时两个矩阵变化为

     

    (2)再让V4成为中转点。

    V5  V1 都没有到达V4的路径,所以也就不存在从V5中转的情况,所以V5 V1 到各个点的距离还是不变。

    V2>V5 经V4中转,原来V2->V5 = inf,经由V4中转之后V2->V4->V5 = 15, 于是V2到V5的最短距离变化为15,更新距离矩阵D(2,5)=15,更新路由矩阵R(2,5) = R(2,4) = 4

    V3>V2经V4中转,原来V3->V2= inf,经由V4中转之后V3->V4->V2 = 5, 于是V3到V2的最短距离变化为5,更新距离矩阵D(3,2)=5,更新路由矩阵R(3,2) = R(3,4) = 4

    V3>V5 经V4中转,原来V3->V5 = 6,经由V4中转之后V3>V4->V5 = 11, 因此V3到V5的最短距离仍为6,不更新。

    这时两个矩阵变化为

     (3)同理,让所有的点都成为一次中转点

    用Matlab来表示上面的过程,其代码为:

    (1)先建立一个.m文件


    function [d,r]=floyd(a)
    n=size(a,1);%测出a矩阵的行数
    d=a;% 初始化距离矩阵
    for i=1:n % 初始化路由矩阵
        for j=1:n
            r(i,j)=j;%使路由矩阵r形成初始矩阵(每一列上的数为该列的列序数,例:第3列上的数全为3)(上面有提到)
        end 
    end 
    r;
    
    for k=1:n % 开始Floyd算法(用if语句来比较中转前后的大小)
        for i=1:n
            for j=1:n
                if d(i,k)+d(k,j)<d(i,j)%需要更新的条件(也就是中转后比原来要小)
                    d(i,j)=d(i,k)+d(k,j);
                    r(i,j)=r(i,k);
                end 
            end 
        end
        k;
        d;
        r;

     (2)在命令行输入矩阵a,也就是距离矩阵

    > a=[0 inf 5 inf inf;
          4 0 inf 6 inf ;
          inf inf 0 2 6;
         inf 3 inf 0 9;
         inf inf 8 inf 0];
    >> [d,r]=floyd(a)

    (3)得出距离矩阵D和路由矩阵R 

    (4)怎么通过得出的这两个矩阵看任意一点到任意一点的最短距离及其路径。

    从任意一点到任意一点从矩阵d中就很容易看出来了,比如D(2,3)=9,就表示V2到V3的最短距离是9,因此两点的距离从矩阵中很容易看出,我就不过多解释了。

    现在我重点来说一下怎么看路由矩阵:

    举个例子:v4->V3

    从距离矩阵中可以看出V4->V3的最短距离是D(4,3) = 12;根据其路由矩阵我们可以看出:

    R(4,3) = 2,表示V4->V3,先经过V2,于是再看R(2,3) = 1,表示还需要再经过V1,于是我们看R(1,3) = 3,这个时候我们发现终于到了V3,所以我们梳理一下,V4->V3的最短路径是:V4->V2->V1->V3。简言之就是固定列,根据路由矩阵在行中跳转,直到跳转到对应的点。

    再来个例子:v5->V2

    从距离矩阵中可以看出V5->V2的最短距离是D(5,2) = 13;根据其路由矩阵我们可以看出:

    R(5,2) = 3,表示V5->V2,先经过V3,于是再看R(3,2) = 4,表示还需要再经过V4,于是我们看R(4,2) = 2,这个时候我们发现终于到了V2,所以V5->V2的最短路径是:V4->V2->V1->V3。

    此时我们已经拿到了我们最开始想要的结果了!!!

    展开全文
  • 用邻接矩阵来存储图,Floyed算法求任意两点间最短路径并输出,广度优先遍历,深度优先遍历
  • 求图中两点间的所有的最短路径

    千次阅读 2019-09-03 11:37:59
    \quad如下图所示,是一个有7个顶点的图,每条边权值均为1,试问从06,有多少条最短路径呢,分别是什么? \quad我们可以直观的看出来,一共有4条最短路径,分别是 0->1->4->6 0->2->4->...

    一、理论篇

    \quad 如下图所示,是一个有7个顶点的图,每条边权值均为1,试问从点0点6,有多少条最短路径呢,分别是什么?
    在这里插入图片描述
    \quad 我们可以直观的看出来,一共有4条最短路径,分别是

    • 0->1->4->6
    • 0->2->4->6
    • 0->2->5->6
    • 0->3->5->6

    \quad 那么问题来啦,我们要如何记录下这些所有的最短路径呢,以前在只需记录一条最短路径的情况下,我们只需要一个数组来记录当前节点的前驱节点是什么,最后再通过不断的获取当前节点的前驱节点来获得路径。在记录所有的最短路径时,我们需要建立一个二维数组,用于存储当前节点可以由哪些节点得到,用最短路算法得到这样一个二维数组后,我们便可以通过DFS得到所有路径。
    \quad 具体而言,针对上面的图,我们建立一个二维数组vector<int> pre[7]来存放0到每个节点的最短路可以由哪些前驱节点得到,那么可知

    • pre[0] = {}
    • pre[1] = {0}
    • pre[2] = {0}
    • pre[3] = {0}
    • pre[4] = {1, 2}
    • pre[5] = {2, 3}
    • pre[6] = {4, 5}

    \quad 这样,我们对pre进行dfs,就可以得到这样一棵递归树。这棵树就是我们的解空间。
    在这里插入图片描述

    二、代码篇

    \quad 现在我们来一步一步写程序实现这个求解过程,主要分为两步,第一步是用Dijistra得到pre数组,第二步是对pre进行DFS获得所有路径。首先,我们看看在Dijistra的最优子结构中,pre如何得到和更新。

    if(dis[v] > dis[u] + G[u][v])
    {
    	dis[v] = dis[u] + G[u][v];
    	pre[v].clear();  //这里要记得clear
    	pre[v].push_back(u);
    }
    else if(dis[v] == dis[u] + G[u][v]) 
    {
    	 pre[v].push_back(u);
    }

    \quad 如果 dis[u] + G[u][v] < dis[v], 说明以u为中介点可以使 dis[v]更优,此时需要令v的前驱结点为u。并且即便原先 pre[v]中已经存放了若干结点,此处也应当先清空,然后再添加u。之后,如果 dis[u] + G[u][v] = dis[v], 说明以 u 为中介点可以找到一条距离相同的路径,因此v的前驱结点需要在原先的基础上添加上 u 结点(而不必先清空pre[v])。完整的Dijistra如下,我用的是队列优化的Dijistra,不优化的话直接将上述最优子结构加在普通的Dijistra上就行:

    #include <iostream>
    #include <vector>
    #include <queue>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int maxn = 1e4+10;
    vector<pair<int, int> > E[maxn];
    vector<int> pre[maxn], temp;
    int vis[maxn], dis[maxn];
    void dijstra(int s)
    {
        fill(dis, dis+maxn, 0x3f3f3f3f);
        dis[s] = 0;
        priority_queue<pair<int, int> > q;
        q.push(make_pair(0, s));
        while(!q.empty())
        {
            int u = q.top().second;
            q.pop();
            if(vis[u]==1) continue;
            vis[u] = 1;
            for (int i = 0; i < E[u].size(); ++i)
            {
                int v = E[u][i].first, w = E[u][i].second;
                if(dis[v]>dis[u]+w)
                {
                    dis[v] = dis[u]+w;
                    pre[v].clear();
                    pre[v].push_back(u);
                    if(vis[v]==0) q.push(make_pair(-dis[v], v));
                }
                else if(dis[v]==dis[u]+w)
                {
                    pre[v].push_back(u);
                    if(vis[v]==0) q.push(make_pair(-dis[v], v));
                }
            }
        }
    }
    int main(int argc, char const *argv[])
    {
        int N, M, s, t;  // 点数,边数,起点,终点
        cin >> N >> M >> s >> t;
        while(M--)
        {
            int u, v, w;
            cin >> u >> v >> w;
            E[u].push_back(make_pair(v, w));
            E[v].push_back(make_pair(u, w));
        }
        dijstra(s);
        for (int i = 0; i < N; ++i)
        {
            printf("pre[%d]: ", i);
            for (int j = 0; j < pre[i].size(); ++j)
            {
                printf("%d ", pre[i][j]);
            }
            printf("\n");
        }
        return 0;
    }
    /*
    输入
    7 9 0 6
    0 1 1
    0 2 1
    0 3 1
    1 4 1
    2 4 1
    2 5 1
    3 5 1
    4 6 1
    5 6 1
    */

    在这里插入图片描述
    \quad 第二部分是对pre进行dfs,获得所有的最短路径。我们从终点t开始dfs,当终点t等于起点s时输出路径,否则取出其前驱节点继续dfs。在程序里面我将注释写得很清楚啦

    void dfs(int s, int t)
    {
        if(s==t) // 当到达起始节点,表明找到啦一条路径,输出
        {
            temp.push_back(t);
            // 输出路径,若不想输出可以用一个二维vector存储每条路径,注意是倒序
            for (int i = temp.size()-1; i >= 0; i--){
                cout << temp[i] << " ";
            }
            cout << endl;
            temp.pop_back(); // 将刚加入的节点删除
            return;
        }
        temp.push_back(t);  // 将当前访问的节点加入临时路径temp后面
        for (int i = 0; i < pre[t].size(); ++i){
            dfs(s, pre[t][i]);
        }
        temp.pop_back();  // 遍历完v点所有的前驱节点,将v删除
    }

    \quad 总的求解程序如下

    #include <iostream>
    #include <vector>
    #include <queue>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int maxn = 1e4+10;
    vector<pair<int, int> > E[maxn];
    vector<int> pre[maxn], temp;
    int vis[maxn], dis[maxn];
    void dijstra(int s)
    {
        fill(dis, dis+maxn, 0x3f3f3f3f);
        dis[s] = 0;
        priority_queue<pair<int, int> > q;
        q.push(make_pair(0, s));
        while(!q.empty())
        {
            int u = q.top().second;
            q.pop();
            if(vis[u]==1) continue;
            vis[u] = 1;
            for (int i = 0; i < E[u].size(); ++i)
            {
                int v = E[u][i].first, w = E[u][i].second;
                if(dis[v]>dis[u]+w)
                {
                    dis[v] = dis[u]+w;
                    pre[v].clear();
                    pre[v].push_back(u);
                    if(vis[v]==0) q.push(make_pair(-dis[v], v));
                }
                else if(dis[v]==dis[u]+w)
                {
                    pre[v].push_back(u);
                    if(vis[v]==0) q.push(make_pair(-dis[v], v));
                }
            }
        }
    }
    void dfs(int s, int t)
    {
        if(s==t) // 当到达起始节点,表明找到啦一条路径,输出
        {
            temp.push_back(t);
            // 输出路径,若不想输出可以用一个二维vector存储每条路径
            for (int i = temp.size()-1; i >= 0; i--){
                cout << temp[i] << " ";
            }
            cout << endl;
            temp.pop_back(); // 将刚加入的节点删除
            return;
        }
        temp.push_back(t);  // 将当前访问的节点加入临时路径temp后面
        for (int i = 0; i < pre[t].size(); ++i){
            dfs(s, pre[t][i]);
        }
        temp.pop_back();  // 遍历完v点所有的前驱节点,将v删除
    }
    int main(int argc, char const *argv[])
    {
        int N, M, s, t;
        cin >> N >> M >> s >> t;
        while(M--)
        {
            int u, v, w;
            cin >> u >> v >> w;
            E[u].push_back(make_pair(v, w));
            E[v].push_back(make_pair(u, w));
        }
        dijstra(s);
        dfs(s, t);
        return 0;
    }
    
    /*
    7 9 0 6
    0 1 1
    0 2 1
    0 3 1
    1 4 1
    2 4 1
    2 5 1
    3 5 1
    4 6 1
    5 6 1
    */

    \quad 运行结果如下:
    在这里插入图片描述

    展开全文
  • 求解两点间最短路径的算法

    千次阅读 2020-07-19 23:42:40
    最短路径算法1.Dijkstra算法2.Bellman-Ford算法3.SPFA算法4.Floyd算法几种最短路径算法的对比Dijkstra算法、Bellman-Ford算法和SPFA算法的对比Dijkstra算法和Floyd算法的...多源最短路算法:求任意两点之间的最短路径.
  • Java版本实现9宫格或者多宫格的两点距离最短的算法。各种大厂的面试题中的最基本算法知识,实现两点之间的最短距离实现方法。
  • 任意两点间距离最短之Floyd算法

    千次阅读 2018-07-11 11:59:17
    基本思想 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。 假设图G中顶个数为N,则需要对矩阵S进行N次更新。初始时,...
  • matlab程序,找出网络中确定两点间的所有最短路径。 注意:输入的矩阵为邻接矩阵。如果两点间没有相邻,请将参数设较大数,例如点i和点j没有相邻,则将Aij设为999。
  • 指定两点间最短路径

    2013-07-26 16:09:59
    从文件读取图,然后寻找指定两点间最短路径,并把寻找结果存入文件中,路径包括一条主路径和备用路径
  • 椭球面上的两点球面距离的解析计算是难以实现的,现提供一种切割方法,可采取贪心策略取得最短路径!
  • 计算到直线的最短距离,适用于地图坐标
  • 我们经常在考试当中看到求线段之和最小的问题,首先来看下这几个数学模型:模型1:两点之间线段最短要在l找点P,使得PA+PB最短,这模型最简单,两点之间线段最短。模型2:将军饮马问题在l上找一点P,使得PA+PB最短,...
  • 引入向量后,通过将空间元素的位置关系转化为数量关系,将过去的形式逻辑证明转化为数值运算,即借助向量法使解题模式化,用机械性操作把问题转化
  • 含有各种障碍物的,水平面两点间最短距离算法。就相当于计算你从一个地方走到另一个地方,最短的路径。 注意:不是图论!不是节点!不是Dijkstra!不是Floyd!
  • 一个图中有很多个顶点,程序是计算各个顶点最短距离。用C++写的。
  • 给定一个乡镇网络图,求取个乡镇的最短路径,并输出路径,以及路径距离的大小。
  • C++ 两点之间最短距离

    千次阅读 2020-10-05 14:27:39
    两点之间最短距离 这是我的一个测试,也是我学习html的起点,他们说一个合格的程序员必须学会html,我比他们起步晚了一些,可是我认为还来的及,以后我就用html来记录我的学习记录了。 问题的提出...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,128
精华内容 30,051
关键字:

两点间距离什么最短