uva1599 理想路徑

2022-06-08 21:21:08 字數 1022 閱讀 8640

對於乙個n個房間m條路徑的迷宮(labyrinth)(2<=n<=100000, 1<=m<=200000),每條路徑上都塗有顏色,顏色取值範圍為1<=c<=10^9。求從節點1到節點n的一條路徑,使得經過的邊盡量少,在這樣的前提下,如果有多條路徑邊數均為最小,則顏色的字典序最小的路徑獲勝。一條路徑可能連線兩個相同的房間,一對房間之間可能有多條路徑。輸入保證可以從節點1到達節點n。

對於這個問題,首先我們需要保證最短路,在這個前提下,我們要保證顏色的字典序盡可能小,解決這個問題,我們可以先從終點開始做一次bfs,統計出每個點到終點需要的最短步數。之後從起點出發,每一步在距離相等的點中選擇顏色最小的點。只需要兩次bfs就解決了這個問題。

#includeusing

namespace

std;

struct

edge

edge[

200000

];int d[100000]; //

該點離終點最短的距離

int ans[100000]; //

記錄路徑上的點

intn,m;

queue

q;vector

a[100000

];void

bfs1()

}

}void

bfs2()

if(mincol1

) ans[d[x]]=mincol;

for(int i=0;i)

}}int

main()

d[n]=0

; q.push(n);

q.push(d[n]);

bfs1();

q.push(1);

memset(ans,-1,sizeof

(ans));

bfs2();

cout

<1]d[n];i--)

cout

<}

return0;

}

UVA 1599 理想路徑

這道題思路很清楚,先反向bfs搜尋點n到每個點的最短距離,然後再從點1正向bfs搜尋,每次搜尋距離減1的點,並將路徑上顏色最小的點入隊,如果有多個相同的則將這多個點入隊。對於佇列中的任意乙個點v,d 1 d v 一定是大於等於0的,所以可以用cost d 1 d v 來記錄到點1為d 1 d v 距...

BFS特訓 理想路徑(UVA1599)

解題思路 先反著做一次bfs,求得所有點到終點的最短距離,然後從起點出發再做一次bfs,每過乙個點判斷是否該點最短距離為原點最短距離減一。遵循這個規律行走的路徑一定是最短的,遇到多條則判斷哪一條顏色數值最小,將結果排入佇列。若同時有多個顏色數最小的則一起排入佇列。注意兩次bfs重複點的判定,第一次b...

Uva 1599 最佳路徑

題意 保證在最短路的時候,輸出字典序最小的路徑。方法 路徑上有了權值,可以利用圖論的資料結構來bfs,很方便。逆序bfs,找到每個點距離終點的最短路長 d x 然後,從起點,沿著 d u d v 1 的路徑,分層bfs,選字典序最小的。找到那個最小字典序的節點之後,從新建佇列。直到找完 d 0 in...