NKOJ4936 JLOI2011 飛行路線

2021-08-21 06:07:14 字數 1469 閱讀 5993

問題描述

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

alice和bob現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。

航空公司對他們這次旅行也推出優惠,他們可以免費在最多k種航線上搭乘飛機。那麼alice和bob這次出行最少花費多少?

輸入格式

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

第二行有兩個整數,s,t,分別表示他們出行的起點城市編號和終點城市編號。(0<=s,t接下來有m行,每行三個整數,a,b,c,表示存在一種航線,能從城市a到達城市b,或從城市b到達城市a,**為c。(0<=a,b輸出格式

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

樣例輸入 1

5 6 1

0 40 1 5

1 2 5

2 3 5

3 4 5

2 3 3

0 2 100

樣例輸出 1

樣例輸入 2

5 8 0

1 00 3 165

0 4 104

4 0 139

1 2 326

3 1 874

2 0 678

4 2 308

4 2 594

樣例輸出 2

提示對於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.

顯然這道題要用最短路做。我用的是dijkstra+堆優化,使用向量儲存資料。

那麼怎麼判斷是否使用免費機會呢?

我們考慮增加一維變為多維最短路,進行動態規劃。

我們設dis[i][k]為起點到i號店的最短路,其中修改了k條線段。

則狀態轉移方程為:

完整程式:

#include#include#include#include#includeusing namespace std;

struct map

;struct node

;vector g[20005];

int dis[20005][15],mark[20005][15],n,kmax;

priority_queue q;

bool operator<(node a,node b)

void dijkstra(int s)

if(dis[x][k+1]>dis[u][k]&&k+1<=kmax)

} }}

int main()

dijkstra(start);

printf("%d",dis[over][kmax]);

}

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現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。航空公司對他們這次...