实用算法实现-第 21 篇 每对顶点间的最短路径

Neo4j数据库中的路径查询语言 记录学习过程中的问题 1、最短路径 allshortestpaths 或者 shortestpath 返回的是最短路径(不考虑权重),即仅考虑最短跳转次数。限定最大深度为7时,它们只返回最短跳转的路径 (1)shortestpath 当最短路径长度为3的路径条数一共有2两条,它只会返回其中一条 p2=graph.run('match p=shortestpath((a:node)-[r:rel*..7]->(b:node)) where a.name="a" and b.name="d" 阅读详情

21.1    每对顶点间最短路径与矩阵乘法

    考虑矩阵乘法D*D,有:

d’’(i, j) = ∑(d’ (i, k) * d’ (k, j))

    考虑有向图每对顶点间的距离邻接矩阵。w(i, j)为由i点都j点的路径距离。故此有矩阵W的i行向量为i到点集合{j, 1≤j≤n}的距离。而矩阵W的j列向量为点集合{i, 1≤i≤n}到j的距离。

    要求最短路径,可以先考虑某一个点i到j的较短路径的求法。由i点到j点,可以通过点集合{k, 1≤k≤n}中任意一点作为中间结点。i通过这些中间点到达j的最短路径就是一条较短的路径。故此i到j的较短路径长度为:

    W’’(i, j) = min(w’ (i, k) + w’ (k, j))

    可以发现上述两式子的相似之处,将‘+’看做‘*’,将‘min’看做‘∑’。可以将求每对顶点间的最短路径问题转化为矩阵乘法。

    由于这里i到j的这条较短路径只是经过一个中间结点的最短路径,所以不一定是图的最短路径。可以知道i到j的最短路径最多需要进过n-1个中间结点,所以需要重复上述运算log(n-1)次即可。

    朴素的矩阵乘法可以在O(n^3)时间内完成,故此该算法的复杂度为O(n^3*log(n))。虽然这种算法较之Floyd-Wallshall算法的O(n^3)要差,但是这种算法可能在并行计算机中能被很好地优化,因为矩阵乘法在并行计算机中有很多优化办法。

21.2    Floyd-Warshall算法

21.2.1   实例

PKU JudgeOnline, 3660, Cow Contest.

21.2.2   问题描述

给出n只奶牛,如果奶牛a的技能值比奶牛b大,那么a就能打败b,现在给出n只奶牛中m对奶牛的技能。对比情况,输出能确定多少只奶牛的排名。

21.2.3   输入

55

43

42

32

12

2 5

21.2.4   输出

2

21.2.5   分析

某只奶牛能否确定其排名,只要能被它打败的奶牛数加上能打败它的奶牛数等于n-1就可用图的语言描述就是顶点的出度加上这个顶点的入度等于n-1(如果顶点i和顶点j能过通过顶点k相连,那么就把顶点k和顶点i相连)。

21.2.6   程序

#include <stdio.h>
#include <string.h>
int main()
{
     boolhash[101][101],map[101][101];
     int n,m;
     int i,j,k;
     scanf("%d%d",&n,&m);
     memset(hash,false,sizeof(hash));
     memset(map,false,sizeof(map));
     for(i=0;i<m;i++)
     {
         inta,b;
         scanf("%d%d",&a,&b);
         hash[a][b]=true;
         map[b][a]=true;
     }
     for(k=1;k<=n;k++){
         for(i=1;i<=n;i++){
              for(j=1;j<=n;j++)
              {
                   hash[i][j]=hash[i][j]||hash[i][k]&&hash[k][j];
                   map[i][j]=map[i][j]||map[i][k]&&map[k][j];
              }
         }
     }
     intmax,min;
     int c=0;
     for(i=1;i<=n;i++)
     {
         max=min=0;
         for(j=1;j<=n;j++)
         {
              if(i==j)
                   continue;
              if(map[i][j])
                   min++;
              if(hash[i][j])
                   max++;
         }
         if(max+min==n-1)
              c++;
     }
     printf("%d\n",c);
     return 0;
}

21.3    实例

PKU JudgeOnline, 3660, Cow Contest.

本文章欢迎转载,请保留原始博客链接http://blog.youkuaiyun.com/fsdev/article

Neo4j高级应用技术专题系列 - APOC存储过程库-【2】路径扩展过程 Neo4j高级应用技术专题系列 - APOC存储过程库-【2】路径扩展过程 使用apoc中的函数和过程: 了解图数据库中已有数据的模型apoc.meta.graph() apoc的路径扩展函数expand()和expandConfig()虚拟关系和路径:apoc.create.vRelationship()即时创建属性和关系处理列表型数据的Cypher函数: filter()e 阅读详情

相关推荐

【算法】单源最短路径——dijkstra算法

一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。 dijkstra算法简介 迪杰斯特拉算法(Dijkstra),是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 需要注意的是,dij

Reimia的博客 3万+

7.7最短路径

7.7最短路径 【最短路径问题】 如果将交通网络画成带权图,结点代表地点,边代表城镇间的路,边权表示路的长度, 则经常会遇到如下问题:两给定地点间是否有通路?如果有多条通路,哪条路最短?还可以 根据实际情况给各个边赋以不同含义的值。例如,对司机来说,里程和速度是他们最感兴趣 的信息;而对于旅客来说,可能更关心交通费用。有时,还需要考虑交通图的有向性,如航行时,顺水和逆水的情况。带权图的最短路径是指两点间的路径中边权和最小的路径。 1. 求某一顶点到其它各顶点的最短路径 设有带权的有向图 D=(V,{

WithoutEndFree的博客 3689

数据结构笔记——最短路径BFS算法

写在前面:科班出身,应届考研党,愿21考研成功上岸,冲冲冲! 目录 一、最短路径问题 二、BFS求无权图的单源最短路径 三、代码实现 四、总结 一、最短路径问题 单源最短路径——BFS算法、Dijkstra算法 其中BFS算法(无权图)、Dijkstra算法(带权图,无权图) 各顶点间的最短路径——Floyd算法(带权图、无权图) 二、BFS求无权图的单源最短路径 注:无权图可以视为一种特殊的带权图,只是每条边的权值都为1 三、代码实现 boo.

晓风岚月 1万+

无向图的最短路径算法JAVA实现

一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点。求出图中所有顶点到源点的最短路径。 无向图的最短路径其实是源点到该顶点的最少边的数目。 本文假设图的信息保存在文件中,通过读取文件来构造图。文件内容的格式参考这篇文章第一部分。   二,算法实现思路 无向图的最短路径实现相对于带权的有向图最短路径实现要简单得多。 源点的最短路径距离为0,从源点开始,采用广度优先的顺序,首先将...

weixin_33911824的博客 977

数据结构:弗洛伊德算法(最短路径)图文详解

弗洛伊德算法通过邻接矩阵存储图(有向图或者无向图)的信息,两点的距离,通过动态转移方程 a[i][j] = min(a[i][j], a[i][p] + a[p][j]); 来更新最短路径,求出各个点之间的最短路径

weixin_52797843的博客 2万+

所有点对间最短路径 | 弗洛伊德算法 | All Pairs Shortest Path | C/C++实现 | 大年初一写优快云

问题描述 请例举出加权有向图G=(V,E)G=(V,E)G=(V,E)中每两点之间的最短路径的长度。 输入: 输入按照以下形式给出 ∣V∣|V|∣V∣ ∣E∣|E|∣E∣ s0s_0s0​ t0t_0t0​ d0d_0d0​ s1s_1s1​ t1t_1t1​ d1d_1d1​ … s∣E∣−1s_{|E|-1}s∣E∣−1​ t∣E∣−1t_{|E|-1}t∣E∣−1​ d∣E∣−1d_{|E|...

qq_40998706的博客 2817

Floyd算法求解各顶点之间最短路径问题

Floyd算法基于动态规划思想,通过一个二维数组记录从一个节点到另一个节点的最短路径长度。算法的核心思想是逐渐增加中间节点,如果在加入一个中间节点后能够获得更短的路径,则更新路径长度。Floyd算法,也称为Floyd-Warshall算法,是一种用于求解图中所有节点之间最短路径的算法。如图:这是一个有三个顶点的有向图,矩阵A存储了两点之间的最短距离,在初始状态下就是一个邻接矩阵;矩阵pre记录了两点之间的最短路径中,加入的中转顶点。的最短路径长度是10,从pre可以知道,从。这个路径路径中,加入了。

weixin_51780040的博客 6571

算法:最短路径之弗洛伊德(Floyd)算法

为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例。图7-7-12的左图是一个简单的3个顶点的连通网图。 我们先定义两个二维数组D[3][3]和P[3][3], D代表顶点与顶点的最短路径权值和的矩阵。P代表对应顶点的最短路径的前驱矩阵。在未分析任何顶点之前,我们将D命名为D(-1),其实它就是初始图的邻接矩阵。将P命名为P(-1), 初始化为图中的矩阵。 首先我

Meditation 2万+

Dijkstra算法——单源最短路径查找

单源最短路径的查找——Dijkstra 算法

qq_61500888的博客 8100

java实现BellmanFord算法

1 问题描述 何为BellmanFord算法? BellmanFord算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其显著特点是可以求取含负权图的单源最短路径。 BellmanFord算法思想: 第一,初始化所有点。每一个点保存一个值,表示从原点到达这个点的距离,将原点的值设为0,其它的点的值设为无穷大(表示不可达)。 第二,进行循环,循环下标为从1到...

南 墙 1万+

如何使用 Dijkstra 算法找到从源到所有顶点的最短路径--附C++/Java源码

本文将详细介绍如何使用 Dijkstra 算法找到从源到所有顶点的最短路径,并附C++/Java源码

DT程序员的博客 480

一看就懂,每对顶点间的最短路径- F算法

/* 2020/12/21 written by HL 所有端间最短径的算法 在某些情况下,要求找出图内所有两端间的最短径。当然,可以用D算法作n次运算,每次一个不同的端作为指定端。 弗洛埃德(Floyd)算法,简称F算法。 */ #include<bits/stdc++.h> using namespace std; #define MAX_VERTEX_NUM 100 //最大矩阵维度 typedef struct MGRAPH { int n;//图中顶点数目 int e;//图.

weixin_45689929的博客 679

基于Java多线程实现所有顶点间最短路径的并行算法

基于Java多线程实现所有顶点间最短路径的并行算法

最短路径-Dijkstra算法与Floyd算法

最短路径-Dijkstra算法与Floyd算法 原文:https://www.cnblogs.com/smile233/p/8303673.html 一、最短路径   ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径。 AE:1 ADE:2 ADCE:3 ABCE:3   ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径。 ...

jacke121的专栏 2594

汇川EASY系列之以太网通讯(套接字socket做主站)

本文讲解汇川Easy系列使用以太网套接字socket通讯,本例中EasyPLC做主站。文中按步进行操作。细节明确。

这是一个长期关注工控行业技术的博客,实现0-1的突破,期待您的关注和留言 2191

matlab安装libsvm常见问题

matlab安装libsvm常见问题 libsvm的官网链接:LIBSVM -- A Library for Support Vector Machines.

cqujcy的博客 1535

最短路径、Dijkstra算法、Floyd算法

最短路径 在非网图中,最短路径是指两个顶点之间经历的边数最少的路径,路径上的第一个顶点称为源点,最后一个顶点称为终点。 在网图中,最短路径是指两点之间经历的边上的权值之和最少的路径。 Dijkstra算法 Dijkstra算法用于求单源点路径问题,问题描述如下:给定带权有向图 G=(V,E)G=(V,E)G=(V,E) 和源点 v∈Vv \in Vv∈V,求从v到G中其余各顶点的最短路径。 迪杰斯特拉提出了一个按路径长度递增的次序产生最短路径的算法,其基本思想是:设置一个集合 S 存放已经找到最短路径的顶点

HMT的博客 527

C#调用Halcon程序三种方法

C#调用Halcon程序三种方法 1.halcon导出C#文件,在C#里面调用 2.在C#里面使用Halcon引擎调用Halcon程序 3.在C#里面使用Halcon引擎调用.hdev下本地函数或者.hdvp外部函数 Halcon引擎手册:C:/Program Files/MVTec/HALCON-21.11-Progress/doc_en_US/html/manuals/programmers_guide/programmers_guide_0120.html 1.导出C#(代码我只给出类,需要调用)

A541925504的博客 1万+

最短路径问题——Dijkstra算法详解(单源最短路径)

单源最短路径 单源最短路径,是指从图中任一点出发到其他各点之间的最短路径。 Dijkstra算法介绍 Dijkstra算法又称迪杰特斯拉算法,dijkstra算法的核心思想是将全部结点所在集合V分成两个集合,一个是已知最短路径的顶点集合S,剩下的是未知最短路径的集合T,同时记录每个结点到源点的最短距离dis。 约定:源点到自身的最短距离为0,无路径的两点间的距离为无穷大。 算法思路: Dijkstra算法步骤: 初始时令S={v0},T={其余顶点}。 第一步:从T中选取一个

weixin_51472673的博客 3473

LTspice仿真三线制PT100高精度测温系统设计

本文详细介绍了如何使用LTspice仿真设计三线制PT100高精度测温系统。文章从三线制原理出发,逐步讲解了在LTspice中建模PT100、构建惠斯通电桥进行信号转换、设计差分放大与滤波电路、选型ADC以及进行系统联调与误差分析的全过程,旨在帮助工程师实现0.5°C分辨率的工业测温方案设计。

pz89012345的博客 98

做蛋白组学数据分析,竟然还不会使用DIA-NN软件,走过路过不要错过,进来免费学习!!!

蛋白组学分析工具DIA-NN使用

wcy1995427的博客 9866
上一篇: 实用算法实现-第 20 篇 单源最短路径
下一篇: 实用算法实践-第 22 篇 字符串匹配
存储李希
博客等级 码龄15年 418粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值