uva1599 雙向bfs 路徑字典序輸出

2021-08-16 18:01:48 字數 891 閱讀 9342

題意:紫書上有。

思路:首先逆向bfs一遍,求出其他所有點到終點的最短距離。然後正著bfs一遍,每次選擇和當前節點到終點距離少1的點,且更新這一步的所選擇的顏色。

這樣列印路徑直接按照步數列印就可以了(其他方式地列印都很麻煩)。

本題有乙個特別需要注意地地方:

字典序最小是整體的,因此不能單單判斷到某個點的顏色最小.。

如:1-2-3  1-3-1  2-4-1  3-4-2  如果單點判斷輸出的字典序是肯定不對的,因此必須進行兩次bfs。還有就是本題的點較多,領接矩陣存圖不可行,應採用鄰接表

ac**:

#include#include#include#include#include#include#include#define debug cout<<"debug"vectore;

void bfs1(){///記錄每個點到終點的最短距離

queueq;

memset(d,-1,sizeof(d));

d[n]=0;

q.push(n);

while(!q.empty()){

int fa=q.front();q.pop();

for(int i=0;i>q;///《點編號,顏色》

q.push(make_pair(1,0));

while(!q.empty()){

int uu=q.front().first;

int cc=q.front().second;

q.pop();

if(color_path[d[1]-d[uu]]!=cc||done[uu]) continue;///如果從1號點到i號點的最後一步的顏色和此時的顏色不同或者這個點已經訪問過

done[uu]=true;

for(int i=0;i

BFS特訓 理想路徑(UVA1599)

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

UVA 1599 理想路徑

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

Uva 1599 最佳路徑

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