链接:
题目描述
Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在 \(n\) 个城市设有业务,设这些城市分别标记为 \(0\) 到 \(n-1\),一共有 \(m\) 种航线,每种航线连接两个城市,并且航线有一定的价格。
Alice 和 Bob 现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多 \(k\) 种航线上搭乘飞机。那么 Alice 和 Bob 这次出行最少花费多少?
分析:
\(0\leq k\leq10\),分层图裸题。
code:
#include<bits/stdc++.h>
using namespace std;
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
const int N=1e4+5;
const int M=1e5+5;
const int K=15;
int n,m,k,s,t;
struct edge{
int v,w,next;
}e[M];
int head[N],en;
inline void insert(int u,int v,int w){
e[++en].v=v;
e[en].w=w;
e[en].next=head[u];
head[u]=en;
}
inline void add(int u,int v,int w){
insert(u,v,w);
insert(v,u,w);
}
struct node{
int u,dis,k;
};
bool operator<(const node &p,const node &q){
return p.dis<q.dis;
}
priority_queue<node> q;
int vis[N][K];
int dijkstra(){
memset(vis,0,sizeof(vis));
node temp;
temp.dis=0;
temp.k=k;
temp.u=s;
q.push(temp);
while(!q.empty()){
int u=q.top().u,dis=-q.top().dis,tk=q.top().k;q.pop();
if(u==t)return dis;
if(vis[u][tk])continue;
vis[u][tk]=1;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v,w=e[i].w;
temp.dis=-(dis+w);
temp.k=tk;
temp.u=v;
q.push(temp);
if(tk){
temp.dis=-dis;
temp.k=tk-1;
temp.u=v;
q.push(temp);
}
}
}
}
signed main(){
n=in,m=in,k=in,s=in,t=in;
s++,t++;
for(int i=1;i<=m;i++){
int u=in+1,v=in+1,w=in;
add(u,v,w);
}
cout<<dijkstra();
return 0;
}