计算无权无向网络中最短路径的条数,用弗洛伊德算法,不是最短路径是最短路径的条数
你把数据和需求发给我
我可以通过弗洛伊德算法来实现求解无权无向图中的最短路径条数。具体步骤如下:
构建一个n * n的二维数组G作为邻接矩阵,其中n为图中节点个数,G[i][j]表示节点i到节点j的距离,若两个节点之间没有联系或者是在单向联系中,则在矩阵中用inf即无线表示。
对邻接矩阵进行初始化。对于邻接矩阵G中的每一对节点i和j,我们先设置path[i][j]=j,表示节点i到节点j的最短路径经过的最后一个节点是j,然后将G[i][j]=G[j][i]的值设置为i,j之间的距离(在此处为1)。
通过三重循环来通过邻接矩阵来更新最短路径。外层循环代表经过的节点数,中层循环代表起始节点,内层循环代表结束节点。如果经过节点k能对i,j节点之间的距离产生缩短,则进行更新操作。
在更新后,我们就可以得到起始节点到其他节点的最短距离。然后,我们再从起始节点开始遍历,以此计算起始节点到其他节点的最短路径条数。当某个节点可以作为前驱节点到达某一节点时,就可以更新该节点到起始节点的最短路径条数。
代码示例如下:
function [d, count] = Floyd_algorithm(G)
n = length(G);
path = zeros(n);
count = zeros(n);
for i = 1:n
for j = 1:n
if G(i,j) == 0 && i ~= j
G(i,j) = inf;
end
path(i,j) = j;
end
end
for k = 1:n
for i = 1:n
for j = 1:n
if G(i,j) > G(i,k) + G(k,j)
G(i,j) = G(i,k) + G(k,j);
path(i,j) = path(i,k);
end
end
end
end
d = G;
for i = 1:n
for j = 1:n
if i ~= j
count(i,j)=calculate_count(i,j,path,count);
end
end
end
end
function c = calculate_count(start, goal, path, count)
c = 0;
temp = goal;
while temp ~= start
c = c + count(start,temp);
temp = path(start,temp);
end
if c == 0
c = 1;
end
end
在代码中,calculate_count函数用于计算起始节点到目标节点的最短路径条数,其中start表示起始节点,goal表示目标节点,path表示最短路径上的最后一个节点,count表示起始节点到该节点的最短路径条数。
测试代码如下:
G = [0 1 1 0 0; 1 0 1 1 0; 1 1 0 1 1; 0 1 1 0 1; 0 0 1 1 0];
[d, count] = Floyd_algorithm(G)
其中,邻接矩阵G表示以下无权无向图,节点1到节点5的最短路径条数分别为1、2、2、1。
1----2
|\ /|
| \/ |
| /\ |
|/ \|
3----4----5