alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在 nnn 個城市設有業務,設這些城市分別標記為 000 到 n−1n-1n−1 ,一共有 mmm 種航線,每種航線連線兩個城市,並且航線有一定的**。
alice和bob現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。航空公司對他們這次旅行也推出優惠,他們可以免費在最多 kkk 種航線上搭乘飛機。那麼alice和bob這次出行最少花費多少?
輸入格式:
資料的第一行有三個整數, n,m,kn,m,kn,m,k ,分別表示城市數,航線數和免費乘坐次數。
第二行有兩個整數, s,ts,ts,t ,分別表示他們出行的起點城市編號和終點城市編號。
接下來有m行,每行三個整數, a,b,ca,b,ca,b,c ,表示存在一種航線,能從城市 aaa 到達城市 bbb ,或從城市 bbb 到達城市 aaa ,**為 ccc 。
輸出格式:
只有一行,包含乙個整數,為最少花費。
輸入樣例#1:
5 6 10 40 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100
輸出樣例#1:
8
對於30%的資料, 2≤n≤50,1≤m≤300,k=0
對於50%的資料, 2≤n≤600,1≤m≤6000,0≤k≤1
對於100%的資料, 2≤n≤10000,1≤m≤50000,0≤k≤10
solution:
本題板子,分層圖+最短路。
對於免費的乘坐機會,等價於使得某條無向邊變為0,由於只有10次免費機會,那麼最多分10層圖,各層的圖都對應原圖,層數代表著消耗的免費次數,當前層的每條邊都可以連有向邊指向下一層對應的節點且邊權為0,這樣去跑最短路,最後只需要統計各層終點的最小值就好了。
**:
/*code by 520 -- 8.21
*/#include
#include
#include
#define il inline
#define ll long long
#define re register
#define for(i,a,b) for(re int (i)=(a);(i)<=(b);(i)++)
#define bor(i,a,b) for(re int (i)=(b);(i)>=(a);(i)--)
using
namespace
std;
using
namespace
__gnu_pbds;
const
int n=3000005,inf=0x7fffffff
;struct
node
};typedef __gnu_pbds::priority_queue
,pairing_heap_tag>heap;
heap q;
heap::point_iterator id[n];
int n,m,k,s,t,dis[n],ans=inf;
intto[n],net[n],h[n],w[n],cnt;
intgi()
il void add(int u,int v,int
c) }
}il
void
dij()));
while(!q.empty())));
else
q.modify(id[to[i]],node());}}
}il
void
init()
intmain()
P4568 JLOI2011 飛行路線
alice 和 bob 現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在nn個城市設有業務,設這些城市分別標記為 00 到 n 1n 1,一共有 mm 種航線,每種航線連線兩個城市,並且航線有一定的 alice 和 bob 現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機...
luoguP4568 JLOI2011 飛行路線
題目中 k 的大小只有 10,我們可以考慮建立分層圖跑最短路 相同層中 a b 的權值仍為 val,不同層中 a b 的權值為 0,相當於免費乘坐了一次飛機 寫乙個最短路就可以啦 include define cios ios sync with stdio false define for i,a...
洛谷 4568 JLOI2011 飛行路線
題目戳這裡 一句話題意 有n個點,m條邊的有向圖,最多可以把k條邊變為0,求從起點到終點最短距離。solution 首先看到這題目,感覺賊難,看起來像dp,貌似也有大佬這麼做,但鑑於本蒟蒻思維能力有限,經過大佬點撥後拿出了失傳已久的絕技 分層圖!廢話真多 那麼我們就可以愉快地建圖了,根據題意,建出k...