傳送門
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: ansans為消耗的最小魔力,不存在輸出-1
sampleinput
23 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: 2case #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...