题意:给出N个城市,M条无向边。每个城市都有一定数目的救援小组,所有边的边权已知。现在给出起点和终点,求从起点到终点的最短路径条数及最短路径上的救援小组数目之和。如果有多条最短路径,则输出数目之和最大的。
分析:
1.第一标尺:顶点i到源点s的最短路径长度 第二标尺:最短路径上的最大点权之和和最短路径条数。
2.图的存储用邻接表实现,整个图为vector<Node> Adj[N],图中每个顶点对应一个vector<Node>型变长数组。
有两个地方需要注意:(1)输入边的时候,边两端顶点要分别push_back(node),即把对方加入。
(2)遍历某个顶点的邻接顶点时,j只是表示其第j个l邻接点,邻接点的编号要用id表示,不可混淆。
3.对于新加入的顶点u
(1)若可以更新到达顶点id的最短路径,即d[u] + Adj[u][j].cost < d[id]
则更新d[id]、sum[id]和num[id]。
(2)若最短路径长度不变,但是可以更新救援队的数目,即 d[u] + Adj[u][j].cost == d[id]&&num[u]+cnt[id]>num[id]
则更新sum[id]和num[id]。
(3)若最短路径长度和最多救援队数目均不可更新,即d[u] + Adj[u][j].cost == d[id] &&