JLOI2011 飛行路線

2022-02-06 03:21:42 字數 1993 閱讀 9717

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=02 \le n \le 50,1 \le m \le 300,k=02≤n≤50,1≤m≤300,k=0 ;

對於50%的資料, 2≤n≤600,1≤m≤6000,0≤k≤12 \le n \le 600,1 \le m \le 6000,0 \le k \le 12≤n≤600,1≤m≤6000,0≤k≤1 ;

對於100%的資料, 2≤n≤10000,1≤m≤50000,0≤k≤102 \le n \le 10000,1 \le m \le 50000,0 \le k \le 102≤n≤10000,1≤m≤50000,0≤k≤10 , 0≤s,t0≤s,t分層最短路, 設dis[i][j]表示到第i個點, 用了j次免費的邊的最短路。

然後對於擴充套件到的每乙個節點都有兩種方案, 一是不把這條邊當成免費邊, 二是把這條邊當做免費邊;

於是就類似乙個動態規劃, 資料卡spfa, 但加了slf優化就過了。

//

luogu-judger-enable-o2

#include #include

#include

#include

using

namespace

std;

const

int n = 10005, m = 100005

;int

n, m, k;

ints, t;

struct

edgeed[m];

inthead[n], cnt;

inline

void add(int x, int y, intz);

head[x] =cnt;

}int dis[n][105

];bool ex[n][105

];struct

date

};inline

void

spfa()

); memset(dis,

0x3f, sizeof

dis);

ex[s][

0] = 1

; dis[s][

0] = 0

;

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

}}

if (tp + 1

<=k));}

}}}}

}int

main()

spfa();

printf(

"%d\n

", dis[t][k]);

return0;

}

JLOI2011 飛行路線

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

JLOI2011 飛行路線

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

JLOI2011 飛行路線

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