洛谷P4568飛行路線

2021-10-21 14:27:09 字數 1471 閱讀 7590

傳送門

主要思想就是分層圖。

分層圖的意思是指,對於每乙個點,可能有多個狀態。

那麼對於每種狀態,我們都用一張圖來儲存,那麼就得到了乙個三維的圖。沒一層都是一種狀態。從當前一層到下一層的辦法就是選擇一條邊為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 現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機...