最短路複習專題,挺簡單的
A題 CF20C Dijkstra?
題意:給定一張無向圖,詢問從1到n的最短路徑方案。
題解:就是dijstra板子,維護一下轉移點即可,但是不要忘記是無向圖。
B題 HDU 2680 Choose the best route
題意:給定一張無向圖,一些起點和一個終點。起點可以任意選取,詢問到終點的最短路徑長度。
題解:只建反邊,從終點跑最短路到起點,選最短的一個即可
C題 HDU 1181 變形課
題意:給定若干字串,每個字串的首字元和尾字元之間有連邊,詢問'b'與'm'之間是否有通路
題解:隨便亂搞,資料範圍很小,floyd求傳遞閉包就能過
D題 HDU 1534 Schedule Problem
題意:有一些專案,每個專案有一定耗時,且專案之間存在一些開始、結束時間上的關係,詢問每個專案的最早開始時間
題解:題目就是給了一些差分約束的條件。SPFA判負環,求最長路即可透過
E題 CF1307D Cow and Fields
題意:給定一個無向圖,邊權均為1,一個點集。在點集中選取兩個點連邊,計算在所有選取方案中連邊後點1到點n的最短路徑長度的最大值
題解:先預處理出每個點到1號點的距離dis[]和到n號點的距離dist[]。設連線的兩個點為s,t,新增可能的最短路徑是dis[s]+dist[t]+1和dis[t]+dist[s]+1,題目要求可以轉化為最大化min(dis[s]+dist[t]+1,dis[t]+dist[s]+1),對兩者作差,前者減後者為(dis[s]-dist[s])-(dis[t]-dist[t]),兩個括號裡的值只與一個點有關,可以預處理f[i]=dis[i]-dist[i]。當f[t]>f[s]時,min(dis[s]+dist[t]+1,dis[t]+dist[s]+1)=dis[s]+dist[t]+1,反之同理。那麼把所有集合裡的點關於f從小到大排序,列舉s,與所有在其右側的t貢獻均為dis[s]+dist[t]+1。這時需要dist[t]最小,維護字尾最小值即可。
F題 CF1422D Returning Home
題解:直接連邊會炸,考慮減少數量,傳送點的數量少,從這裡下手。手玩發現只需按x排序連邊,y排序連邊就可以
G題 CF543B Destroying Roads
題解:考慮題中兩條路徑最多相交一段連續的邊,直接列舉這一段邊的左右端點,判斷取最小值即可
H題 CF449B Jzzhu and Cities
在跑最短路時對每一個點記錄能取得最小dis的所有連邊。
對於一個點的連邊,令a為連向非1節點的邊的數量,b為連向1節點的數量
如果a不為0,這b條邊可以全部刪掉。若a為0,則可以刪掉b-1條