BZOJ 2763 JLOI2011 飛行路線

2022-05-12 11:20:06 字數 1579 閱讀 4875

2763: [jloi2011]飛行路線

time limit: 10 sec memory limit: 128 mb

submit: 4298 solved: 1655

[submit][status][discuss]

description

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

input

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

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

比較簡單的dp+最短路,和普通的最短路一樣,但是最短路裡不寫dis,dp[x][i]表示到達x一共用了i次免費。dp[u][i]=min(dp[x][i-1],dp[x][i]+val[i])。

bzoj上直接過,結果luogu卡spfa!!各種優化卡常結果還是t乙個點,最後乖乖的寫了dijkstra,上份spfa壓壓驚。

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 10005;

const

int maxm = 50005;

const

int inf = 0x3f3f3f3f;

inline

int rd()

while(isdigit(ch))

return x*f;

}int n,m,k,s,t;

int head[maxn],cnt;

int nxt[maxm<<1],to[maxm<<1],val[maxm<<1];

int ans=1e9+1,dp[maxn][15];

bool vis[maxn];

queue

q;inline

void add(int bg,int ed,int v)

inline

void spfa()

}for(register

int j=1;j<=k;j++)

}

} }}

}int main()

for(register

int i=1;i<=n;i++)

for(register

int j=0;j<=k;j++)

dp[i][j]=inf;

spfa();

for(register

int i=0;i<=k;i++)

ans=dp[t][i]printf("%d",ans);

return

0;}

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 表示到編號...