2023年8月10號提高組T2 飛行

2021-08-07 01:55:10 字數 1185 閱讀 7651

description

有n個城市,編號為0到n-1。小b想從城市s到城市t。他們選擇了一家航空公司,這家公司有m種航線,每種航線連線了兩個不同的城市。看在小b是個妹子的份上,航空公司的老總給了小b一點優惠:小b可以免費在最多k種航線上搭乘飛機。問小b最小花費是多少。

input

第一行三個整數n,m,k,分別表示城市數量,航線數量和免費搭乘的航線數量。

第二行兩個整數s,t,表示起點和終點。

接下來m行,每行三個整數a.b.c,表示一種航線,即可以從a到b,也可以從b到a,花費為c。

output

一行乙個整數,表示最小花費。

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 hint

對於前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,c<=1000.

做法:其實和普通最短路沒啥區別,在外圍多列舉乙個k就好了(用spfa或dij都可以)

**如下(spfa):

#include

#include

#include

using namespace std;

struct arr

f[100007];

int ls[50007],list[100007],n,m,k,s,t,e,d[50007][11];

bool v[50007];

void spfa()

}for (int j=1;j<=k;j++)

}if (d[list[head]][j]+f[i].wto][j])}}

}v[list[head]]=0;

}}int main()

spfa();

int ans=10000000;

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

ans=min(ans,d[t][i]);

cout<}

2023年8月9日提高組T2 覆蓋

現在小b拿到了一條長度為n的木塊,初始時上面什麼顏色都沒有。為了美觀,現在小b希望把它的n個單位長度分別塗上紅 綠 藍三種顏色,每種顏色可以用乙個大寫字母表示,分別是 rgb。作為乙個不合格的油漆工,每次你可以把一段連續的木版塗成隨意一種顏色,但是你發現,後塗的顏色會覆蓋先塗的顏色。為了方便,請你用...

2023年8月15日提高組T2 購買

bpm想要購買m種物品,每種物品只用購買一件。現在一共有n家商店,但走到第i家商店的路費為d i 而在第i家商店購買第j種物品的花費為c i,j 問你最少需要花費多少錢。第一行包含兩個正整數n,m,表示商店數和物品數。接下來n行,每行先是乙個正整數d i 表示到第i家商店的路費。接下來m個正整數,依...

2023年8月15日提高組T2 購買

description bpm想要購買m種物品,每種物品只用購買一件。現在一共有n家商店,但走到第i家商店的路費為d i 而在第i家商店購買第j種物品的花費為c i,j 問你最少需要花費多少錢。input 第一行包含兩個正整數n,m,表示商店數和物品數。接下來n行,每行先是乙個正整數d i 表示到第...