最短路_搜索
搜索实现最短路
设置一个dis数组,dis[i]代表某点(以原点为例)到 i 点的最短距离。
更新原则: 遍历点u想连的点v,若 dis[u] + edge[u].w < dis[v] , 则更新dis[v] = dis[u] + edge[u].w
-
标记数组的问题
标记数组check,标记的是某点是否在队列中,如果不在,则入队。 而不是标记的是否被访问过。
因为入队的原因是,原点到该点的最短距离变了,因此与该点有关系的点 的距离也有可能发生变化,所以要重新遍历这些点。所以已经在队列里的点i,允许dis[i]继续更新。 这样就解决了 点u到点v有多路径,无法选择最短的那一条路的问题。 -
记录到某点i最短路的条数
设置数组in,in[i]代表原点到点i最短路的条数。
在最短路实现过程中for(i = 0; i < con[x].size(); i++) //与点x想连的边 { to = con[x][i].to; w = con[x][i].w; if(dis[to] > dis[x] + w) { dis[to] = dis[x] + w; in[to] = 1; //每当最短路发生变化时,重新将in数组置为1. 使之前纪录的“最短路”条数作废。 if(check[to] == 0) { check[to] = 1; qq.push(to); } } else if(dis[to] == dis[x] + w) { in[to] ++; //当有相同的距离是,条数加一 } }