#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,k,s,t,head[1000005],vis[1000005],dis[1000005],cnt;
struct edge{
int v,w,next;
}e[5000005];
struct node{
int dis,u;
bool operator< (const node &x)const{return x.dis<dis;}
};
inline void add(int u,int v,int w){
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
}
inline void dijkstra(){
priority_queue<node> q;
dis[s]=0;
q.push((node){0,s});
while(!q.empty()){
int x=q.top().u;
q.pop();
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i!=-1;i=e[i].next){
int y=e[i].v;
if(dis[y]>dis[x]+e[i].w){
dis[y]=dis[x]+e[i].w;
if(!vis[y]){
q.push((node){dis[y],y});
}
}
}
}
}
int main(){
memset(head,-1,sizeof(head));
scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
for(int i=0;i<=n*(k+1);i++)dis[i]=2147483647;
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
for(int j=1;j<=k;j++){
add(a+(j-1)*n,b+j*n,0);
add(b+(j-1)*n,a+j*n,0);
add(a+n*j,b+n*j,c);
add(b+n*j,a+n*j,c);
}
}
for(int i=1;i<=k;i++){
add(s+(i-1)*n,s+i*n,0);
}
dijkstra();
printf("%d\n",dis[t+k*n]);
}
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,k,s,t,cnt,head[100005],dis[100005][15];
bool vis[100005][15];
struct edge{
int v,w,next;
}e[200005];
struct node{
int dis,u,time;
bool operator<(const node &x)const{return x.dis<dis;}
};
inline void add(int u,int v,int w){
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
}
inline void dijkstra(){
priority_queue<node> q;
memset(dis,0x3f,sizeof(dis));
q.push((node){0,s,0});
dis[s][0]=0;
while(!q.empty()){
node now=q.top();q.pop();
if(vis[now.u][now.time])continue;
vis[now.u][now.time]=1;
for(int i=head[now.u];i!=-1;i=e[i].next){
int v=e[i].v;
if(dis[now.u][now.time]<dis[v][now.time+1]&&now.time+1<=k){
dis[v][now.time+1]=dis[now.u][now.time];
q.push((node){dis[now.u][now.time],v,now.time+1});
}
if(now.dis+e[i].w<dis[v][now.time]){
dis[v][now.time]=now.dis+e[i].w;
q.push((node){dis[v][now.time],v,now.time});
}
}
}
}
inline int min(int x,int y){return x<y?x:y;}
int main(){
memset(head,-1,sizeof(head));
scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
dijkstra();
int ans=2147483647;
for(int i=0;i<=k;i++)ans=min(ans,dis[t][i]);
printf("%d\n",ans);
}
原文:https://www.cnblogs.com/Y15BeTa/p/10962183.html