题面:https://www.luogu.org/problem/P4568
本题是分层图裸题
Code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<queue>
using namespace std;
const int N=5000005;
int n,m,k,s,t,cnt,Next[N],head[N],to[N],val[N],dis[N];
bool visit[N];
struct Node{
int id,dis;
friend bool operator<(Node x,Node y){
return x.dis>y.dis;
}
};
priority_queue<Node> Q;
void add(int x,int y,int z){
to[cnt]=y;
val[cnt]=z;
Next[cnt]=head[x];
head[x]=cnt++;
}
void dijkstra(){
memset(dis,0x3f,sizeof(dis));
memset(visit,0,sizeof(visit));
Q.push((Node){s,0});
dis[s]=0;
while(!Q.empty()){
int u=Q.top().id;
Q.pop();
if(visit[u]){
continue;
}
visit[u]=true;
for (int i=head[u];i!=-1;i=Next[i]){
int v=to[i];
if(dis[v]>dis[u]+val[i]){
dis[v]=dis[u]+val[i];
if(!visit[v]){
Q.push((Node){v,dis[v]});
}
}
}
}
}
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);
for(int j=1;j<=k;j++){
add(x+(j-1)*n,y+j*n,0);
add(y+(j-1)*n,x+j*n,0);
add(x+j*n,y+j*n,z);
add(y+j*n,x+j*n,z);
}
}
for(int i=1;i<=k;i++){
add(t+(i-1)*n,t+i*n,0);
}
dijkstra();
printf("%d\n",(m<k?0:dis[t+n*k]));
return 0;
}