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