https://nanti.jisuanke.com/t/31001
分层图最短路的裸题。
#include<iostream>
#include<stdio.h>
#include<queue>
#define LL long long
using namespace std;
const int N = 1e5+44;
const int M = 400000+44;
const LL inf = 0x3f3f3f3f3f3f3f3f;
int head[N],nxt[M],to[M],cnt=-1;
int W[M];
void add(int u,int v,int w)
{
cnt++;
nxt[cnt]=head[u];
to[cnt]=v;
W[cnt]=w;
head[u]=cnt;
}
LL dis[N][11];
int vis[N][11];
struct node
{
int u,k;
LL dis;
node(int uu,LL dd,int kk):u(uu),dis(dd),k(kk){}
bool friend operator < (node a,node b)
{
return a.dis>b.dis;
}
};
int n,m,k;
LL dij()
{
for(int i=1;i<=n;i++)
for(int j=0;j<=k;j++)
dis[i][j]=inf,vis[i][j]=0;
dis[1][0]=0;
priority_queue<node>q;
q.push(node(1,0,0));
while(!q.empty()){
node now = q.top();
q.pop();
int u=now.u;
int K=now.k;
if(vis[u][K]) continue;
vis[u][K]=1;
for(int i=head[u];~i;i=nxt[i]){
int v=to[i];
if(dis[v][K]>dis[u][K]+W[i]){
dis[v][K]=dis[u][K]+W[i];
q.push(node(v,dis[v][K],K));
}
if(K>=k) continue;
if(dis[v][K+1]>dis[u][K]){
dis[v][K+1]=dis[u][K];
q.push(node(v,dis[v][K+1],K+1));
}
}
}
return dis[n][k];
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&k);
cnt=0;
for(int i=1;i<=n;i++) {
head[i]=-1;
}
while(m--){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
printf("%lld\n",dij());
}
return 0;
}