题目链接
题目思路
这就是分层图啊,其实感觉就是多维最短路而已
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define fi first
#define se second
#define debug printf("aaaaaaaaaaa\n");
const int maxn=5e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const ll INF=0x3f3f3f3f3f3f3f3f;
const double eps=1e-7;
int n,m,k;
int s,t;
int head[maxn],cnt;
int dis[maxn][15];
struct edge{
int to,next,w;
}e[maxn<<1];
void add(int u,int v,int w){
e[++cnt]={v,head[u],w};
head[u]=cnt;
}
struct node{
int len,pos,free;
friend bool operator<(node a, node b){
return a.len>b.len;
}
};
void dij(int x){
priority_queue<node> que;
memset(dis,0x3f,sizeof(dis));
dis[x][0]=0;
que.push({0,x,0});
while(!que.empty()){
int len=que.top().len;
int pos=que.top().pos;
int free=que.top().free;
que.pop();
if(len!=dis[pos][free]) continue;
for(int i=head[pos];i;i=e[i].next){
if(dis[e[i].to][free]>dis[pos][free]+e[i].w){
dis[e[i].to][free]=dis[pos][free]+e[i].w;
que.push({dis[e[i].to][free],e[i].to,free});//一定注意是len为fi
}
if(free<k){
if(dis[e[i].to][free+1]>dis[pos][free]){
dis[e[i].to][free+1]=dis[pos][free];
que.push({dis[e[i].to][free+1],e[i].to,free+1});//一定注意是len为fi
}
}
}
}
}
int main(){
cin>>n>>m>>k;
cin>>s>>t;
for(int i=1,u,v,w;i<=m;i++){
cin>>u>>v>>w;
add(u,v,w),add(v,u,w);
}
dij(s);
int ans=inf;
for(int i=0;i<=k;i++){
ans=min(ans,dis[t][i]);
}
printf("%d\n",ans);
return 0;
}