水题
但是我弱啊
去年10月份模拟赛
我居然没做起
分层图最短路
dp[i][j]表示到i点用了j次膜法的最小值
于是水过啊
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=500001;
struct Front_star{
int u,v,w,nxt;
}e[N*4];
int cnt=0;
int first[N]={};
void add(int u,int v,int w){
cnt++;
e[cnt].u=u;
e[cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=first[u];
first[u]=cnt;
}
int n,m,k;
struct Node{
int u,w,sum;
}a[N*4];
bool operator <(Node A,Node B){
return A.w>B.w;
}
int dis[N][21]={};
priority_queue<Node> q;
int S,T;
void Dij(){
q.push((Node){S,0,0});
memset(dis,0x3f,sizeof(dis));
dis[S][0]=0;
while(!q.empty()){
Node tmp=q.top();
q.pop();
int u=tmp.u;
int id=tmp.sum;
for(int i=first[u];i;i=e[i].nxt){
int v=e[i].v;
if(dis[v][id]>dis[u][id]+e[i].w){
dis[v][id]=dis[u][id]+e[i].w;
q.push((Node){v,dis[v][id],id});
}
if(id<k){
if(dis[v][id+1]>dis[u][id]){
dis[v][id+1]=dis[u][id];
q.push((Node){v,dis[u][id],id+1});
}
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d",&S,&T);
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
Dij();
cout<<dis[T][k];
}