Age of Moyu
题意
给你n个点,m条边,要求从1号走到n号,每条边上都有一种颜色,如果你在相同颜色的边上走,不会有额外的花费,但是如果你从一种颜色的边走到另一种颜色的边上,那么就要加1的花费,求的是最小花费。
1<=n<=1e5, 0<=m<=2e5
多组。
思路
如果直接bfs优先队列处理大顶堆的话,把跑过的点或者边标记了的话,是考虑不周到的。
如:
6 8
1 2 2
2 3 2
3 4 2
1 4 1
1 5 1
4 5 2
5 6 2
2 6 1 答案应该是1,但是很多都容易输出2。
正确的做法是,用set[i]储存每次到达点i的前驱结点,如果到达这个点的花费比历史中到达这个点的最小花费要大,就continue,如果相等,前驱结点在set中,continue,如果不在set中,就放入set中,如果小于的话,就把set[i]清空,然后把历史最小花费mincost[i]更新了,并且把前驱结点放到set中(我发现放这条边的颜色也是可以的),然后对当前这个点连出去的每一条边继续判断,如果不是反向边,而且mincost[nxt]>=((当前颜色!=下个颜色)+mincost[i]),就把mincost[nxt]更新了,并且如果nxt点不是终点,就把nxt点push到优先队列中,优先队列存的是每一个点的到达状态,按照到达的花费从小到大放。
看!代码
1 |
|