UVA 1599 Ideal Path(雙向bfs+字典序+非簡單圖的最短路+隊列判重)
阿新 • • 發佈:2017-09-12
ems code can scan min 時機 define index end
https://vjudge.net/problem/UVA-1599
給一個n個點m條邊(2<=n<=100000,1<=m<=200000)的無向圖,每條邊上都塗有一種顏色。求從結點1到結點n的一條路徑,使得經過的邊數盡量少,在此前提下,經過邊的顏色序列的字典序最小。一對結點可能有多條邊,一條邊可能連接相同的結點(自環)。輸入保證結點1可以到達結點n。顏色是1~10^9的整數。
分析:
- 從題目中我們可以看出,題目中的無向圖是可以出現自環和重邊的,自環我們可以在輸入的時候檢查並排除,但是重邊我們需要保留,並從中選擇顏色最小的邊。
- 題目的數據量很大,不可能采用鄰接矩陣存儲圖,因此應采用鄰接表,且鄰接表便於進行bfs
- 路徑的顏色不代表路徑的權重,本題中路徑是無權的
思路:
從終點開始倒著bfs一次,得到每個點到終點的距離,然後從起點開始,按照每次距離減1的方法尋找接下來的點的編號。按照顏色最小的走,如果有多個顏色最小,則都拉入隊列中,將最小的顏色記錄在res數組中。
其中,index=d[0]-d[u]就得到了當前u節點對應的距離,也就是步驟數。
細節:
- 已經進入隊列的節點不能重復入隊,否則復雜度太高,會tle(重復入隊的復雜度至少是O(n^2),在n=100000的情況下直接tle)
- 第一次bfs和第二次bfs的終止時機不同,第一次找到起點就終止,第二次則是從隊列中取出節點時才能終止,為的是遍歷完所有導向終點且路徑長度一致的邊,只有這樣才能結果正確
- d數組記錄每個節點到終點n的距離,不能用0進行初始化,而終點處的初始化必須是0
- d數組不能不初始化,否則對於多輸入題目,前面的輸入可能影響後面的輸出
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <sstream> 5 #include <set> 6 #include <vector> 7 #include <stack> 8 #include <map> 9
UVA 1599 Ideal Path(雙向bfs+字典序+非簡單圖的最短路+隊列判重)