对于给定无向图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