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,...