12.带权有向图中任意两点间的最短路径

其实它的代码理解起来真的挺难的我觉得!!!昨天看了一下午感觉晦涩难懂,还是matlab好用,直接调用函数就可以了!!!不过这里还是得跟大家介绍一下:1.问题的理解:像这种带权的有向图,每一行都表示该行标号对应列标号的有向权值,本身到本身的数值为0,没办法到达的数值为∞2.最优子结构i,j是图里面的两个不同顶点,设p为从i到j的不经过{k+1,k+2,...n}点的最短路...
摘要由CSDN通过智能技术生成

其实它的代码理解起来真的挺难的我觉得!!!

昨天看了一下午感觉晦涩难懂,还是matlab好用,直接调用函数就可以了!!!

不过这里还是得跟大家介绍一下:

1.问题的理解:

像这种带权的有向图,每一行都表示该行标号对应列标号的有向权值,本身到本身的数值为0,没办法到达的数值为∞

2.最优子结构

i,j是图里面的两个不同顶点,设p为从i到j的不经过{k+1,k+2,...n}点的最短路径

(1)若p不经过顶点k,则p也是从i到达j其间不经过{k,k+1,k+2...n}的最短路径

(2)若p经过顶点k,我们把前半段从i到k记为p1,后半段从k到j记做p2,则p1是从i到k不经过{k,k+1,...n}的最短路径,p2是从k到j的其间不经过{k,k+1,k+2...n}的最短路径

算法伪代码:

FLOYD-WARSHALL(w)

1.    for i<-1 to n

2.      do for j<-1 to n

3.        do if i=j or w[i,j]=∞

4.          then π[i,j]<-NIL

5.          else π[i,j]<-i

6.    D<-w

7.    for k<-1 to n

8.      do for i<- 1 to n

9.        do for j<-1 to n

10.        if D[i,j]>D[i,k]+D[k,j]

11.           then D[i,j]<-D[i,k]+D[k,j]

12.                   π[i,j]<-π[k,j]

13.    return D,π

(吐槽一下,这里的D其实就是每行标号到每列标号的最短距离,后期程序出来后还是很漂亮的,然后这里的π我就不知道什么鬼了,索性就不管他啦,哈哈!!)

PRINT-ALL-PAIRS-SHORTEST -PATHS(π,i,j)

1.    if i=j

2.      then print i

3.      else if π[i,j]=NIL

4.             then print"no path from " i “to” j "exists"

5.              else PRINT-ALL-PAIRS-SHORTEST-PATHS(π,i,π[i,j])

6.                      print j

C++:

floyd.h

#define _floyd_h
#include<string.h>
#include<float.h>
#include<stdio.h>
#include"pair.h"
#include<malloc.h>
pair floydwarshall(double* w,int n){
    double *d=(do

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值