bzoj2763 飛行路線

2022-03-25 20:03:21 字數 1568 閱讀 3525

time limit: 10 sec  memory limit: 128 mb

submit: 3273  solved: 1260

[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

d[i][j] : 點i經過了j次免費機會的最短路

分類討論一下免費機會用不用的更新

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int n = 100010;

int head[n], to[n], rest[n], w[n], tot;

void add(int u, int v, int wi)

struct node ;

queueq;

int inq[n][20], dis[n][20], n, m, k, s, t, ans;

int main()

memset(dis, 0x3f, sizeof(dis));

q.push((node) );

dis[s][k] = 0;

inq[s][k] = 1;

while(q.size()) );

inq[v][k] = 1;}}

if(k && dis[v][k - 1] > dis[u][k]) );

inq[v][k - 1] = 1;}}

}}

ans = 0x3f3f3f3f;

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

printf("%d\n", ans);

}

BZOJ 2763 飛行路線

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

BZOJ 2763 飛行路線

time limit 10 sec memory limit 128 mb submit 3113 solved 1168 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,...