拆點最短路 新板子get

2021-08-03 22:26:47 字數 2137 閱讀 6632

傳送門

timelimit:1000ms  memorylimit:32768mb

64-bit integer io format:

%i64d

problem description

說粗來泥萌可能不信,home_w喜歡的公主被魔王抓走了!!!

home_w當然是要去救公主的,但是魔塔的結構很複雜,home_w需要聰明的你幫助他,找到一條最省魔力的路徑去打到魔王,拯救公主。

魔塔有n個傳送陣,編號從1-n,而且魔塔有很多層,最多不超過n層,編號從1-n。

任意相連的兩層裡的傳送陣都可以互相傳送(比如第二層有傳送陣 1  2,第三層有傳送陣 3 4  ,那麼 1-3,1-4,2-3,2-4都可以互相傳送,這些傳送費用都為c)

傳送當然需要消耗魔力了,相連兩層之間傳送消耗的魔力 為c,另外home_w還得知,有額外的m條傳送通道(雙向)

home_w初始位置為編號為1的傳送陣,魔王在編號為n的傳送陣上。

input

輸入第一行乙個t表示t組測試資料

第一行三個數n,m(0<=n,m<=1e5),c(1<=c<=1e3)  n個傳送陣,m個額外的傳送通道,相連兩層之前傳送花費為c

接下來一行n個數a1-an,表示第i個傳送陣在ai層

接下來m行,每行三個數u,v,w 表示從傳送陣u傳送到v需要花費w的魔力 (1<=w<=1e4)

output

對於第i組樣例輸出

case #i: ans
ans為消耗的最小魔力,不存在輸出-1

sampleinput

2

3 3 3

1 3 2

1 2 1

2 3 1

1 3 3

3 3 3

1 3 2

1 2 2

2 3 2

1 3 4

sampleoutput

case #1: 2

case #2: 3

第乙個樣例:傳送陣1 - 2 花費為1

傳送陣2 - 3 花費為1

傳送陣1 - 3 花費為3

第一層到第二層 互相傳送的傳送陣 1 - 3 花費為 3

第二層到第三層 互相傳送的傳送陣 3 - 2 花費為 3

答案是 1-2-3 花費為2

如果沒有層與層直接可以任意傳送,這題就是個普通的最短路,但是有這個條件,所以需要將一層抽象為乙個點,這一層的所有點與這個抽象的點聯通,這些邊的長度為0,但如果建雙向的邊,那一堆邊為

0的點就會進入死迴圈,所以這時候就需要拆點

將乙個點拆為兩個點,乙個點入,乙個點出

#include #include #include #include #include #include #include #include #include #include #include #include #include #define pi acos(-1)

using namespace std;

typedef long long ll;

typedef double db;

const int maxn = 2e5 + 5;

const int mod = 1e9 + 7;

const int inf = 1e8 + 5;

const ll inf = 1e15 + 5;

const db eps = 1e-8;

int cnt, head[maxn]; ll dis[maxn];

struct edge

} e[maxn*4];

void add(int u, int v, int co)

void init()

void dij(int s, int len)

; dis[s] = 0;

pq.push((edge));

while (!pq.empty()) );}

}}

}int a[maxn];

void solve()

for (int i = 1; i <= m; i++)

dij(1, n*2);

if (dis[n] == inf) dis[n] = -1;

cout << dis[n] <

遊戲 最短路,拆點

把問題抽象成圖論應該不難 也許都不用抽象?但是怎麼建邊怎麼跑就千差萬別了。首先應該注意到的一點是座標的範圍是0 500,也就是501 501個位置,所以陣列 佇列不要開小。另外題目給出的莉露露沒說位置不能重複,所以每個點可能不止入隊一次,仍然要注意陣列大小。剛開始一直在想複雜度與n掛鉤的演算法,但是...

HDU 5521 Meeting 拆點 最短路

題目鏈結 給m個由圖中結點組成的點集,點集中的點兩兩連通且距離為相等的ti。現有兩人分別從1和n點處同時出發嗎,問能否相遇以及相遇的最短時間。很容易想到直接分別以點1和點n為起始點求最短路,再遍歷各個點即可求得最短相遇時間。然而建圖上卻有問題 這個題中的邊是以點集的形式給出,極端情況下可能會出現有1...

HDU 5521 Meeting 拆點 最短路

題目鏈結 給m個由圖中結點組成的點集,點集中的點兩兩連通且距離為相等的ti。現有兩人分別從1和n點處同時出發嗎,問能否相遇以及相遇的最短時間。很容易想到直接分別以點1和點n為起始點求最短路,再遍歷各個點即可求得最短相遇時間。然而建圖上卻有問題 這個題中的邊是以點集的形式給出,極端情況下可能會出現有1...