洛谷 飛行路線
題目描述
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 ...