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只有一行,包含乙個整數,為最少花費。
5 6 1
0 40 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100
8對於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.
正解:分層圖最短路。
原來這就是所謂分層圖最短路,還以為多麼高階呢。。
直接跑spfa即可,爆狀態那麼用迴圈佇列,$tle$那麼交換列舉狀態,先鬆弛不免費的,再鬆弛免費的。
1//it is made by wfj_2048~
2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include
13#define inf (1<<30)
14#define n (10010)
15#define il inline
16#define rg register
17#define ll long long
18#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
1920
using
namespace
std;
2122
struct edgeg[20*n];
23struct dataq[20*n];
2425
int head[n],dis[n][12],vis[n][12],s,t,n,m,k,num,size=200000;26
27 il int
gi()
3435 il void insert(rg int
from,rg int to,rg int
dis),head[from]=num; return;37
}3839 il void
spfa(),dis[s][0]=0,vis[s][0]=1;42
while (h!=t),vis[v][x.k]=1;51
}52}53
if (x.k+1
<=k && dis[v][x.k+1]>dis[x.x][x.k]),vis[v][x.k+1]=1;58
}59}60
}61 vis[x.x][x.k]=0;62
}63return;64
}6566 il void
work()
7273
intmain()
bzoj 2763 JLOI2011 飛行路線
本題我用的二維spfa,dis i j 表示到i點用掉了j次免費機會的最優值,相當於動態規劃,由於資料十分大,普通spfa會t掉3個點,所以考慮堆優化 相信堆優化大家都懂,所以這些提示就夠了 include include includeusing namespace std struct ddji...
bzoj2763 JLOI2011 飛行路線
time limit 10 sec memory limit 128 mb submit 1367 solved 527 submit status discuss alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在n個城市設有業務,設這些城市分別標記為0到n 1...
bzoj 2763 JLOI2011 飛行路線
description n個點,m條雙向邊,有k次免費的機會,問最短路。sample input 5 6 1 0 4 0 1 5 1 2 5 2 3 5 3 4 5 2 3 3 0 2 100 sample output 8這道題基本演算法是spfa,但需要定乙個f的二維陣列,f i j 表示到編號...