最短路_搜索

搜索实现最短路

设置一个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] ++;                  //当有相同的距离是,条数加一
    		}
    	}
    
    
原文地址:https://www.cnblogs.com/daybreaking/p/12782896.html