#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define pi pair<int,int>
const int maxn=1e4+9;
int d[maxn][11],cnt,k,head[maxn];
struct Edge{
int val,to,next;
}edge[maxn*10];
void init(){
memset(head,-1,sizeof(head));
cnt=0;
}
struct node{
int dist,pt,pile;
node(int dist,int pt,int pile):dist(dist),pt(pt),pile(pile){}
bool operator < (const node &a)const{
if(dist==a.dist)return pile >a.pile;
return dist>a.dist;
}
};
void add(int u,int v,int val){
edge[cnt].next=head[u];
edge[cnt].val=val;
edge[cnt].to=v;
head[u]=cnt++;
}
int djk(int s){
memset(d,inf,sizeof(d));
d[s][0]=0;
priority_queue<node>q;
q.push(node(0,s,0));
while(!q.empty()){
node nd=q.top();;
int u=nd.pt;
q.pop();
int j=nd.pile;
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to;
int w=edge[i].val;
if(d[v][j]>d[u][j]+w){
d[v][j]=d[u][j]+w;
q.push({d[v][j],v,j});
}
if(j+1<=k&&d[v][j+1]>d[u][j]){
d[v][j+1]=d[u][j];
q.push({d[v][j+1],v,j+1});
}
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
init();
int i,j,n,m,s,t;
cin>>n>>m>>k>>s>>t;
while(m--){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);add(y,x,z);
}
djk(s);
int ans=inf;
for(i=0;i<=k;i++)ans=min(ans,d[t][i]);
cout<<ans<<endl;
}
分层最短路模板
最新推荐文章于 2021-10-06 22:28:34 发布