满意答案
脑袋瓜GDGF
2013.10.02
采纳率:47% 等级:11
已帮助:10699人
你只要求中转次数最少的话非常简单,不需要代码就可以理解
不知道你的临界表具体是设计成什么样了,但是你可以依据下面的思想稍微改进一下
假设这个新表W中:
所有的车站都被编号为0~n
W[0][]表示起点A
W[1][]表示重点B
W的初始化方式就是将所有存在的边存进去(存边两头的车站编号)
例如
W = [A: 0 0 0 1 2 3 3 5
B: 1 3 4 2 4 2 4 4]
这表示车站0与车站1之间存在一条路(直接抵达的,无需中转),(0,3)、(0,4)...相同
估计你是无向图,这样就可以了,如果是有向图,方法类似,在建表时最好按A的序号排序,方便编码时控制遍历
W初始化完成后,就开始计算W^2,W^3...直到W^n为0,也就是计算W矩阵的幂,矩阵相乘的公式就不给你列了,这个例子中W的幂是3,W^4开始就等于0了
W^2 = [A:0 0 1 3
B:2 4 4 4]
W^3 = [A:0
B:4]
在W^i中存在的点对(x,y),即表示x与y之间存在一条需要中转i-1次的路径
例如W^2中的第一个点对(0,2),表示车站0与车站2之间存在一条需要中转1次的路径
实际应用中:
只要你的图不变,以上的矩阵计算只需要计算一次然后存下来就可以了;
如果你想知道具体的路线,可以遵循以下思路:
1.按上述方法,先查表,看看起点x与终点y之间是否存在通路
这个过程中就已经可以确定A、B之间的最少中转次数n了
2.写一个迭代n-1次的for循环,从W^(n-1)、B=y开始,终止于在W^0中发现路径(A,B),其中A=x,每次迭代中发现的B=y的路径集合{W‘}中的A即为下次迭代中的B
例如x = 0,y = 2:
1.W^0中不存在,W^1中存在,因此车站(0,2)之间至少要换成1次
2.从n=(1-1)=0开始:从W^0中查找B=y的所有点对W’={(1,2),(3,2)},其中A={1,3}即为中转车站集合
=> 最少中转路线为 车站0 - 车站1 - 车站2
车站0 - 车站3 - 车站2
以此类推即可,最少路线({W‘}中的元素)可能不唯一,如果你要找出所有解,就必须遍历全部
代码实现核心在于这个for循环,给个例子,具体怎么设计看你自己习惯
写个指针数组P,P[i]就是W^(i+1)的地址指针
temp[] = {y}; //初始化中转车站为终点y
for(i = n-1; i>=0; i--)
for(j = 0; j < num_W; j++) //遍历一边P[i]的第2行(B行)
for(k = 0; k < num_temp; k++) //找出所有B=temp[]的点对
if(P[i][1][j] = temp[k])
//存储找到的点对{W'}
//更新temp[] = {W'}中的{A}
00分享举报