求最短路floyd算法 CodeFoces - 601A

http://codeforces.com/problemset/problem/601/A  

要求一个点到另一个点的最短路径,可以看成 求该点到这两点之间 某一个中点的距离+中点到另一点的距离之和的最小值

用一个二维数组map[n][n] (n为节点个数) 保留点i到点j 的距离 

可以得到方程 map[i][j]={

                                              min(map[i][k]+map[k][j],map[i][j])    (map[i][j]!=0)

                                              map[i][k]+map[k][j]                            (map[i][j]==0)

                                        }

对于一个有向图map[i][j]与map[j][i] 不相等, 对于一个无向图map[i][j]与map[j][i] 相等,所以输入每条边的时候map[i][j]与map[j][i]

都要存一次 ,对于该题,可以将铁路图与公路图分开求,先将铁路的map_rail[n][n] 所有点为0,当读入一条边,将对应点赋值为1,表示存在,同时将公路图的map_route[n][n]所有点为1;当读入一条边时,将对应点赋值为0;表示不存在。

然后三个for循环 当map_rail[i][k]=0 或者map_rail[k][j]=0 说明 中点k在起点,终点,或者不存在 可直接coutinue;

同理当map_rout[i][k]=0 或者map_rout[k][j]=0  说明中点k不存在  (可以先将map_rout[i][i]=0这样可以减少k在起点和中点的判断)

coutinue;

小技巧 当读入数据之后 如果map_rail[1][n]==1; 说明 存在一条铁路从起点到终点 那么他的最小路径就是1 ,则只需要找公路图的最小路径,反之亦然。

如果最小路径找到则输出最小路径,否则输出-1

https://paste.ubuntu.com/p/vPw5GqtjfD/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值