【最短路】求最大可靠路的算法及其matlab实现

内容来源:《图论算法及其matlab实现》(北京航空航天出版社)

P34

【算法用途】

求图中两顶点间的最大可靠路。

代码如下:

 1 %最大可靠路的算法
 2 %调用Floyd文件
 3 function [P p f]=p_pathf(A)
 4 %f=0表示找到路,否则f=1
 5 %初始化
 6
 7 [m n]=size(A);
 8 f=0;
 9 B=zeros(m,n);
10 %对原矩阵进行转换
11 for i=1:m
12     for j=1:n
13         if A(i,j)>0&A(i,j)<1
14             B(i,j)=-log(A(i,j));
15         elseif A(i,j)==0
16             B(i,j)=inf;
17         end
18     end
19 end
20 %利用Warshall-Floyd算法求最短路
21
22 [P d]=Floyd(B);
23 if d<inf
24     p=1;
25     for i=1:(length(P)-1)
26         p=p*A(P(i),P(i+1));%计算最短路的完好概率
27     end
28     p;
29 else
30     p=0;
31     P=0;
32     f=1;
33 end
34     

其中,函数Floyd代码如下:

 1 function [P,u ] = Floyd(W)
 2 %W表示权值矩阵
 3 %P表示最短路径
 4 %u表示最短路的权和
 5 n=length(W);
 6 U=W;
 7 m=1;
 8
 9 while m<=n   %判断是否满足停止条件
10     for i=1:n
11         for j=1:n
12             if U(i,j)>U(i,m)+U(m,j)
13                 U(i,j)=U(i,m)+U(m,j);   %更新dij
14             end
15         end
16     end
17     m=m+1;
18 end
19 u=U(1,n);
20
21 %输出最短路的顶点
22 P1=zeros(1,n);
23 k=1;
24 P1(k)=n;
25 V=ones(1,n)*inf;
26 kk=n;
27 while kk~=1
28     for i=1:n
29         V(1,i)=U(1,kk)-W(i,kk);
30         if V(1,i)==U(1,i)
31             P1(k+1)=i;
32             kk=i;
33             k=k+1;
34         end
35     end
36 end
37 k=1;
38 wrow=find(P1~=0);
39 for j=length(wrow):(-1):1
40     P(k)=P1(wrow(j));
41     k=k+1;
42 end
43
44 end

检验一下:

A=[1 0.8 0 0 0.2 ;
    0.4 1 0.7 0 0;
    0 0.8 1 0.5 0;
    0.6 0 0 1 0.4;
    0.3 0 0.7 0.5 1];

[P p f]=p_pathf(A)

运行结果:

P =

     1     5

p =

    0.2000

f =

     0

时间: 2024-10-26 21:50:40

【最短路】求最大可靠路的算法及其matlab实现的相关文章

【最短路】求两点间最短路的Floyd算法及其matlab实现

代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P22 此代码返回第一个点和最后一个点之间最短路径,以及最短路径的长度. 代码如下: 1 function [P,u ] = Floyd(W) 2 %W表示权值矩阵 3 %P表示最短路径 4 %u表示最短路的权和 5 n=length(W); 6 U=W; 7 m=1; 8 9 while m<=n %判断是否满足停止条件 10 for i=1:n 11 for j=1:n 12 if U(i,j)>U(i,m)+U

【最短路】求两点间最短路径的改进的Dijkstra算法及其matlab实现

代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P18 书中提出了基于经典Dijkstra算法改进的两种算法. 其中算法Ⅱ的效率较高. 代码如下: 1 function a=Dijk(a) 2 %a(输入量)表示图的邻接矩阵 3 %a(输出量)表示所求最短路径的距离矩阵 4 5 %建立邻接矩阵,若不还是对称矩阵,则变为对称矩阵 6 n=length(a); 7 for i=2:n 8 for j=1:(i-1) 9 a(i,j)=a(j,i); 10 end 11 end 1

【最短路】必须通过两个指定点的最短路径算法及其matlab实现

代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P25 首先,函数n2shorf用来计算任意两点之间最短路径长度及最短路经过的节点 需输入起点.终点 1 function [ P u] = n2shorf( W,k1,k2) 2 3 %W表示权值矩阵 4 %k1表示始点,k2表示终点 5 %P表示两顶点之间最短路,u表示最短路的距离 6 7 8 %初始化 9 n=length(W); 10 U=W; 11 m=1; 12 %Floyd算法思想 13 while m<=n

poj 3592 Instantaneous Transference 强连通图 缩点 再求最长路

1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<stack> 5 #include<queue> 6 using namespace std; 7 #define maxx 44 8 #define maxx2 44*44 9 #define INF 99999999 10 char s[maxx][maxx]; 11 bool tong[maxx2

POJ 3592--Instantaneous Transference【SCC缩点新建图 &amp;amp;&amp;amp; SPFA求最长路 &amp;amp;&amp;amp; 经典】

Instantaneous Transference Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6177   Accepted: 1383 Description It was long ago when we played the game Red Alert. There is a magic function for the game objects which is called instantaneous

zoj3795 Grouping --- 强连通,求最长路

给定图,求把至少把图拆成几个集合能够使集合内的点没有直接或间接关系. 首先由题意可得图中可能含环,而环里面的点肯定是要拆开的. 缩点建图得DAG图,可以想象一下..把图从入度为零的点向下展开,位于同一层的点放在一个集合是没有关系的, 那么题目所求的问题就转化成求图中最长路的问题了. 这个题的实质和 这题 其实是一模一样的.. #include <iostream> #include <cstring> #include <string> #include <cst

POJ 3592--Instantaneous Transference【SCC缩点新建图 &amp;&amp; SPFA求最长路 &amp;&amp; 经典】

Instantaneous Transference Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6177   Accepted: 1383 Description It was long ago when we played the game Red Alert. There is a magic function for the game objects which is called instantaneous

【HDOJ1217】【Floyd求最长路】

http://acm.hdu.edu.cn/showproblem.php?pid=1217 Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9455    Accepted Submission(s): 4359 Problem Description Arbitrage is the use of discrepa

HDU - 6201 transaction transaction transaction(spfa求最长路)

题意:有n个点,n-1条边的无向图,已知每个点书的售价,以及在边上行走的路费,问任选两个点作为起点和终点,能获得的最大利益是多少. 分析: 1.从某个结点出发,首先需要在该结点a花费price[a]买书,然后再在边上行走,到达目的地后,在目的地b获得price[b]. 2.因此可以建立两个虚拟结点, 虚拟结点1连向n个点,边权分别为-price[i],表示以i为起点,需花费price[i]买书. n个点连向虚拟结点2,边权分别为price[i],表示以i为终点,通过卖书可得price[i]. 3