点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=10010,M=100010,K=15;
int h[N],ne[M],e[M],idx,w[M];
int dist[N][K];
int st[N][K];
int n,m,k;
int s,t;
void add(int a,int b,int c)
{
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
struct Node{
int cost;
int id;
int k;
bool operator>(const Node& other) const{
return cost>other.cost;
}
}node;
void dijkstra()
{
memset(dist,0x3f,sizeof dist);
priority_queue<Node,vector<Node>,greater<Node>> heap;
dist[s][0]=0;
heap.push({dist[s][0],s,0});
while(!heap.empty()){
auto t=heap.top();
heap.pop();
int u=t.id;
int d=t.cost;
int cnt=t.k;
if(st[u][cnt]) continue;
st[u][cnt]=true;
for(int i=h[u];i!=-1;i=ne[i]){
int j=e[i];
if(dist[j][cnt]>d+w[i]){
dist[j][cnt]=d+w[i];
heap.push({dist[j][cnt],j,cnt});
}
if(cnt<k&&dist[j][cnt+1]>d){
dist[j][cnt+1]=d;
heap.push({dist[j][cnt+1],j,cnt+1});
}
}
}
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
memset(h,-1,sizeof h);
cin>>n>>m>>k;
cin>>s>>t;
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
dijkstra();
int ans=0x3f3f3f3f;
for(int i=0;i<=k;i++){
ans=min(dist[t][i],ans);
}
cout<<ans<<endl;
return 0;
}