分層最短路

2022-04-08 15:19:01 字數 3681 閱讀 9656

洛谷 飛行路線

題目描述

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

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

輸入格式

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

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

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

輸出格式

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

輸入輸出樣例

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

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

對於100%的資料,2 \le n \le 10000,1 \le m \le 50000,0 \le k \le 102≤n≤10000,1≤m≤50000,0≤k≤10,0 \le s,t說什麼分層最短路,我是做到這種型別的了,然後一蒙,,什麼啊,但是搜出相關題目一看,這個做法還是很好理解的,就是有點dp的思想

明顯,此題為最短路問題,但是考慮到可以免費搭乘(即直接通過一條邊無需費用.)

這種問題有乙個官方的名字 分層圖最短路問題

分層圖最短路是指在可以進行分層圖的圖上解決最短路問題.

是不是聽起來就很nb?

具體分層圖是啥,我也不知道

一般模型:

​  在圖上,有kk次機會可以直接通過一條邊,問起點與終點之間的最短路徑.

很明顯,這道題是乙個裸的分層圖最短路問題 (貌似這類問題都挺裸的 emm

解法 我們設

dis[i][j]代表到達ii用了jj次免費機會的最小花費.

vis[i][j]代表到達ii用了jj次免費機會的情況是否出現過.

對於某條路徑我們可以選擇使用機會,也可以選擇不使用機會.

討論這兩種情況即可

#include 

#include

#include

#include

#include

using namespace std;

int n , m , k , s , t ;

const

int n =

1e6+10;

int e[n]

, h[n]

, w[n]

, ne[n]

, idx , vis[

20100][

15], dis[

20100][

15];void

add(

int a ,

int b ,

int c)

struct node};

void

dijkstra()

);while

(q.size()

));if

(!vis[e[i]

][now]

&& dis[e[i]

][now]

> dis[u]

[now]

+ w[i]

) dis[e[i]

][now]

= dis[u]

[now]

+ w[i]

, q.

push

(node);

}}}int

main()

dijkstra()

;int ans =

0x7f7f7ff

;for

(int i =

0;i <= k;i ++

) ans =

min(ans , dis[t]

[i])

; cout << ans << endl ;

return0;

}

輸入

輸入包括:

•一行,整數x(1≤x≤1000)表示您到達之間的時間和您將被接收的時間(以分鐘為單位);

•一行有三個整數n,m和t,其中

輸出輸出一行包含乙個整數,在公園停留x分鐘所需的最小量,或者它是乙個陷阱。(包括期間)如果不能保持正好x分鐘。

樣例輸入

複製樣例資料

44 4 1

1 22 3

3 44 1

1 22 1

5 43 3

樣例輸出

8

多開一維狀態記錄時間,d[i][t] = 經過時間t走到節點i的最小花費

每乙個狀態分別向「原地等待」與「前往下乙個節點」轉移

#include 

#include

#include

#include

using namespace std;

const

int n =

1e4+10;

typedef long

long ll ;

int h[n *2]

, vis[n]

[1005];

ll dis[n]

[1005];

ll p[n]

, t[n]

;int n , m , pick , t ;

struct edge

edge[n *2]

;struct node};

int idx ;

void

add(

int a ,

int b , ll c)

void

dijkstra()

);dis[1]

[t[1]]

= p[1]

;while

(q.size()

));for

(int i = h[u]

;i !=-1

;i = edge[i]

.ne));

}}}int

main()

for(

int i =

1;i <= n; i ++

) cin >> t[i]

>> p[i]

;dijkstra()

;if(vis[1]

[pick]

) cout << dis[1]

[pick]

<< endl ;

else

cout <<

"it is a trap."

<< endl ;

return0;

}

分層最短路

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

upc 小說 分層最短路

時間限制 1 sec 記憶體限制 128 mb 提交 88 解決 36 提交 狀態 命題人 admin 題目描述 輸入第1行三個整數n,m,k,意思如題目描述。第2到第n 1行是x,y,z指走連線x號小區和y號小區的主幹道要耗費z點體力 輸出一行乙個整數,表示小s最少耗費的體力。複製樣例資料 5 7...

小雨坐地鐵 (分層最短路 建立虛點)

思路 建立乙個虛點層,題目等價於求虛點層起點到終點的最小花費。同一層邊花費b,虛點層到其他每層花費a。跑一邊dijkstra即可。ac include using namespace std const int n 1e6 5,inf 0x3f3f3f3f struct edgee n int h ...