傳送門
主要思想就是分層圖。
分層圖的意思是指,對於每乙個點,可能有多個狀態。
那麼對於每種狀態,我們都用一張圖來儲存,那麼就得到了乙個三維的圖。沒一層都是一種狀態。從當前一層到下一層的辦法就是選擇一條邊為0。既然可以選k條,那麼總共就有k + 1層。
如上圖,無向圖中,有邊1-2,1-5,2-3,2-4,3-4,3-5。上半部分就是原圖,底下的五個1』、2』、3』、4』、5』對應的是上面的各自點。其中的虛線就是表示選擇了一條邊為0。
所以分層圖比普通的圖多的操作是:每一張圖都額外建立k張複製,同時,相鄰的兩張要設立一條權為0的邊(當兩點之前本就有邊,例如2-3有邊,就連線2』-3和3』-2,2和5無邊,就不需要建立)
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int n =
600005*10
;const
int m =
600005*10
;typedef pair<
int,
int>pii;
struct edge
e[m *2]
;int n, m, eid, p[n]
, k;
void
init()
void
insert
(int u,
int v,
int w)
int dist[n]
;bool st[n]
;void
dijkstra
(int start,
int end));
while
(!q.
empty()
));}
}}}int
main()
insert
(u + j * n, v + j * n, w)
;//同一層內建邊
insert
(v + j * n, u + j * n, w);}
}dijkstra
(s, t)
;int ans =
0x3f3f3f3f
;for
(int i =
0; i <= k; i++
) ans =
min(ans, dist[t + i * n]);
//本題有個陷阱,即k和n的大小關係不知,所以需要一層一層判斷
cout << ans;
return0;
}
BZOJ2763 洛谷P4568飛行路線
題目中文不再贅述直接開講 題目中要求最短,那麼肯定要跑最短路 我這裡用的玄學u優化spfa據說不優化會t,具體如何優化可以參考一下我的部落格,玄學優化 那麼如何跑出不選一些邊的最短路呢?暴力列舉?顯然不是很現實,所以我們要引入乙個新的演算法叫做分層圖最短路,顧名思義,將乙個圖拆成若干個圖,每個圖中有...
洛谷 4568 JLOI2011 飛行路線
題目戳這裡 一句話題意 有n個點,m條邊的有向圖,最多可以把k條邊變為0,求從起點到終點最短距離。solution 首先看到這題目,感覺賊難,看起來像dp,貌似也有大佬這麼做,但鑑於本蒟蒻思維能力有限,經過大佬點撥後拿出了失傳已久的絕技 分層圖!廢話真多 那麼我們就可以愉快地建圖了,根據題意,建出k...
P4568 JLOI2011 飛行路線
alice 和 bob 現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在nn個城市設有業務,設這些城市分別標記為 00 到 n 1n 1,一共有 mm 種航線,每種航線連線兩個城市,並且航線有一定的 alice 和 bob 現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機...