BFS特訓 理想路徑(UVA1599)

2021-08-24 17:57:10 字數 1057 閱讀 7375

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

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

sample input

4 6

1 2 1

1 3 2

3 4 3

2 3 1

2 4 4

3 1 1

sample output

2

1 3

#include#include#include#include#includeusing namespace std;

struct edge

edge[200000];

int d[100000]; //該點離終點最短的距離

int ans[100000]; //記錄路徑上的點

int n,m;

//bool mark[100000]; //本來是想第二次bfs2中用的,實際畫蛇添足了,因為第二次走的都是最短路徑,有重複的點也是需要判斷的

queueq;

vectora[100000];

void bfs1()

d[n]=0;

q.push(n);

q.push(d[n]);

bfs1();

// for(int i=1;i<=n;i++)

//

cout<} return 0;

}

UVA 1599 理想路徑

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

uva1599 理想路徑

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

BFS特訓 萬聖節後的早晨(UVA1601)

解題思路 直接bfs列舉會存在大量重複的判斷,題目中明示每4個至少有乙個 且圖中空格 部分形成連通塊,故可以將能夠行走的路徑單獨抽離出來。這裡可以利用vector陣列的方式,每個位置連線可以行走的下乙個位置,以此進行遍歷。另一點即是可以將x,y座標轉換成一維的整數,方便查詢。題目描述 小寫字母a,b...