RT,46分,萌新刚学分层图,代码如下,三四六七八九WA其他AC,谢谢大佬
#include<iostream>
#include<queue>
using namespace std;
long long n,m,f,t,v,start,k,l,ans=0x3f3f3f,to;
struct edge
{
int t,v,n;
}e[10000000];
struct gl
{
int i;
long long sum;
}poi;
long long dis[100000000];
bool vis[10000000];
long long top,head[10000000];
priority_queue < gl > q;
bool operator < (gl a,gl b)
{
return a.sum>b.sum;
}
void add_edge(int f,int t,int v)
{
top++;
e[top].t=t;
e[top].v=v;
e[top].n=head[f];
head[f]=top;
}
void Dijstra()
{
poi.i=start;
poi.sum=0;
q.push(poi);
for(int i=1;i<=n*(k+1);i++)dis[i]=2147483647;
dis[start]=0;
while(!q.empty())
{
l=q.top().i;
q.pop();
if(vis[l])continue;
vis[l]=1;
for(int i=head[l];i;i=e[i].n)
{
if(dis[e[i].t]>dis[l]+e[i].v)
{
dis[e[i].t]=dis[l]+e[i].v;
poi.i=e[i].t;
poi.sum=dis[e[i].t];
q.push(poi);
}
}
}
for(int i=1;i<=k+1;i++)ans=min(ans,dis[to*i]);
}
int main()
{
cin>>n>>m>>k>>start>>to;
start+=1;
to+=1;
for(int i=1;i<=m;i++)
{
cin>>f>>t>>v;
f++;
t++;
add_edge(f,t,v);
for(int j=0;j<=k;j++)
{
add_edge(f+n*j,t+n*j,v);
add_edge(t+n*j,f+n*j,v);
if(j<k)
{
add_edge(f+n*j,t+n*(j+1),0);
add_edge(t+n*j,f+n*(j+1),0);
}
}
}
Dijstra();
cout<<ans;
return 0;
}