JLOI2011 飛行路線

2022-05-19 18:58:15 字數 1264 閱讀 2196

alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在 n 個城市設有業務,設這些城市分別標記為 0 到 n−1 ,一共有 m 種航線,每種航線連線兩個城市,並且航線有一定的**。

alice和bob現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。航空公司對他們這次旅行也推出優惠,他們可以免費在最多 k 種航線上搭乘飛機。那麼alice和bob這次出行最少花費多少?

輸入格式:

資料的第一行有三個整數, n,m,k ,分別表示城市數,航線數和免費乘坐次數。

第二行有兩個整數, s,t ,分別表示他們出行的起點城市編號和終點城市編號。

接下來有m行,每行三個整數, a,b,c ,表示存在一種航線,能從城市 a 到達城市 b ,或從城市 b 到達城市 a ,**為 c 。

輸出格式:

只有一行,包含乙個整數,為最少花費。

輸入樣例#1:複製

5 6 1

0 40 1 5

1 2 5

2 3 5

3 4 5

2 3 3

0 2 100

輸出樣例#1:複製

對於100%的資料, \(2≤n≤10000,1≤m≤50000,0≤k≤10.\)

\(0≤s,t

k<=10?那豈不是可以建乙個分層圖,第0層代表不用優惠,第1層代表用1次優惠,我們從第\(i\)層想第\(i+1\)層建邊代表當前這次用優惠,跑一遍dijkstra就行了。

**如下:

#include#include#include#includeusing namespace std;

typedef pairpr;

priority_queue,greater>q;

struct node

a[5001000];

int len,last[5100000],x[5010000],y[5010010],z[5010000],s,t,d[5010010],vis[5010000];

void add(int a1,int a2,int a3)

void dijkstra()

);d[s]=0;

//cout);}}

}}int main()

}dijkstra();

for(int p=0;p<=k;p++)

ans=min(ans,d[t+p*n]);

cout<

JLOI2011 飛行路線

提交傳送門 師兄們覺得我是不是很挫啊,做了1天多才做出這道裸spfa 人家只是試著打了一下拆點而已嘛 就是spfa只是2維而已 d i 0 代表第i個點 不用免費次數時得最小距離 d i 1 代表第i個點 用免費次數時得最小距離 就很簡單了是不是?description alice和bob現在要乘飛...

JLOI2011 飛行路線

alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在 nnn 個城市設有業務,設這些城市分別標記為 000 到 n 1n 1n 1 一共有 mmm 種航線,每種航線連線兩個城市,並且航線有一定的 alice和bob現在要從乙個城市沿著航線到達另乙個城市,途中可以進行...

JLOI2011 飛行路線

alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司 該航空公司一共在n個城市設有業務,設這些城市分別標記為0到n 1 共有m種航線,每種航線連線兩個城市,並且航線有一定的 alice和bob現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機 航空公司對他們這次旅行也推出優惠,...