P4568 JLOI2011 飛行路線

2022-03-04 04:13:40 字數 1958 閱讀 8437

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 1

0 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...