中转次数最少c语言,数据结构C语言,图的临接表实现列车中转次数最少的路线。最少要有可行的思路,如果有代码希望能简单讲解...

满意答案

dcebd7a0de6265b6ccae5ead692f1eab.png

脑袋瓜GDGF

2013.10.02

dcebd7a0de6265b6ccae5ead692f1eab.png

采纳率: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分享举报

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值