UVA 1599 理想路徑

2021-08-03 18:44:38 字數 937 閱讀 5800

這道題思路很清楚,先反向bfs搜尋點n到每個點的最短距離,然後再從點1正向bfs搜尋,每次搜尋距離減1的點,並將路徑上顏色最小的點入隊,如果有多個相同的則將這多個點入隊。

對於佇列中的任意乙個點v,d[1]-d[v]一定是大於等於0的,所以可以用cost[d[1]-d[v]]來記錄到點1為d[1]-d[v]距離的最小顏色值。一開始寫完交上去tle,還以為是每次呼叫n次vector的clear太慢,後來看網上的**才發現是節點重複入隊的問題,所以這裡需要記錄乙個節點是否已經在佇列中了,避免重複入隊,時間複雜度才為o(m),不然就是o(n^2)了。

**如下:

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 100005;

const

int maxm = 200005;

struct edge

edge()

};vector

g[maxn];

int d[maxn];

int n, m;

int cost[maxn];

int vis[maxn];

bool inqueue[maxn];

void bfs()}}

}void printans()

void bfs2()

for (int i = 0; i < g[v].size(); i++)}}

printans();

}int main()

}bfs();

bfs2();

}return

0;}

uva1599 理想路徑

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

BFS特訓 理想路徑(UVA1599)

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

Uva 1599 最佳路徑

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