BZOJ 2763 飛行路線

2021-08-03 12:56:35 字數 1663 閱讀 2271

time limit: 10 sec  memory limit: 128 mb

submit: 3113  solved: 1168 [

submit][

status][

discuss]

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.

也是乙個類似於dp的圖論題,設計狀態為f[i][k]表示從s點到i點,使用k次免費機會的最小花費。考慮轉移,無法從前面推過來,故從當前狀態往i+1方向推,不難看出f[i][k]可以向f[j][k]和f[j][k+1]轉移(當i與j連通時)。

#include#include#include#include#include#include#include#define pa pair#define pai pair#define inf 50000010

using namespace std;

const int maxn=10010;

const int maxm=100010;

const int maxk=15;

struct edge

;edge e[maxm];

int head[maxn],cnt;

int f[maxn][maxk];

void addedge(int u,int v,int w)

priority_queue < pai , vector, greater> q;

bool visit[maxn][maxk];

int main()

} for (int i=1;i<=m;i++)

memset(visit,false,sizeof(visit));

q.push(make_pair(make_pair(0,s),0));

f[s][0]=0;

while (!q.empty())

visit[x][y]=true;

for (int i=head[x];i;i=e[i].next)

if (y+1>k)

if (f[v][y+1]>f[x][y])

}} cout<

BZOJ 2763 飛行路線

2763 jloi2011 飛行路線 time limit 10 sec memory limit 128 mb description alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在n個城市設有業務,設這些城市分別標記為0到n 1,一共有m種航線,每種航線連...

bzoj2763 飛行路線

time limit 10 sec memory limit 128 mb submit 3273 solved 1260 submit status discuss alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在n個城市設有業務,設這些城市分別標記為0到n ...

bzoj2763 飛行路線

這個題是前幾天做的分層圖問題,而且比較直接,多加乙個維度就可以了 include include include include using namespace std struct inter 100010 structes queue qwq int n,m,k,x,y,z,s,t1,tail,...