计算图中任意两个顶点的所有最短路径的数量

时间:2018-12-06 01:00:37

标签: algorithm dynamic-programming graph-theory graph-algorithm shortest-path

对于给定无向图G =中的任意一对不同的顶点,我想找到所有最短路径的数量(缩写为“ SP”)(不需要或没有必要找到/打印确切的顶点在某个路径上)。例如,对于以下以边缘列表格式给出的图形,有两个SP:(1,3,2)和(1,4,2)。

顶点 =

1   3
2   4
1   4
2   3
1   8
4   7
3   6
5   2

我想基于Floyd-Warshall算法实现该算法,这是一种基于动态编程思想的著名算法,可以找到O(N ^ 3)中每对顶点的最短路径的值。结果是一个二维数组a [n] [n]。 n是顶点数。对于上图,它是:

0   2   1   1   3   2   2   1
2   0   1   1   1   2   2   3
1   1   0   2   2   1   3   2
1   1   2   0   2   3   1   2
3   1   2   2   0   3   3   4
2   2   1   3   3   0   4   3
2   2   3   1   3   4   0   3
1   3   2   2   4   3   3   0

构造图矩阵 G 并求解矩阵 a 的代码如下:

v = vertex(:,1);
t = vertex(:,2);
G = zeros( max(max(v),max(t)));

% Build the matrix for graph:
for i = 1:length(v)
    G(v(i), t(i)) = G(v(i), t(i)) + 1; 
    G(t(i), v(i)) = G(v(i), t(i)); % comment here is input is bi-directional
end

a = G;
n = length(a);
a(a==0) = Inf;
a(1:n+1:n^2)=0; % diagonal element  to be zero

for k = 1:n
    for i= 1:n
        for j= 1:n %  for j=i+1:n
            if a(i,j) > a(i,k) + a(k,j)
                a(i,j) = a(i,k) + a(k,j);
%                 a(j,i) = a(i,j);
            end
        end
    end
end

现在,让我们将2D数组b [n] [n]定义为每对顶点的所有SP的数量。例如,我们期望b [1] [2] = 2。 我在MATLAB中编写了以下代码(如果您不熟悉MATLAB,请将其视为伪代码)。它为所有对给出几乎正确的值,除了某些对有几个错误的值。例如。运行编码后,e b [5] [8] = 0,这是错误的(正确答案应为2

%% 
% find the number of ALL SP paths for ALL pairs based on the "a" array:
% b is a two-dim array, b(i,j) is the total number of SP for pair( i,j)
b = G;
for k=1:n
    for i=1:n
        for j= i+1:n

            if(i==j)
                continue; % b(i,i)=0
            end

            if (k==j) % the same as : G(k,j)==0
                continue;
            end

            if(k==i && G(k,j)~=0)
                b(i,j) = 1;
                continue;
            end

            if(a(i,j) ~= a(i,k)+G(k,j)) % w(u,v)=G(u,v) in unweighted graph)
                continue;
            end  

            % sigma(s,v) = sigma(s,v) + sigma(s,u);
            b(i,j) = b(i,j) + b(k,i);
        end
    end
end

0 个答案:

没有答案