手写堆,迪杰斯特拉,分层图,WA#4#10 感谢帮助
#include<bits/stdc++.h>
using namespace std;
int N,M,K,S,T;
int head[200020],nex[2500020],to[2500020],jg[2500020],cnt;
int dis[200020],dui[200020],cd,use[200020];
void push(int x)
{
cd++;
dui[cd]=x;
int i=cd;
while(i>1&&dis[dui[i/2]]>dis[dui[i]])
{
swap(dui[i/2],dui[i]);
i=i/2;
}
}
void pop()
{
dui[1]=dui[cd];
cd--;
int i=1;
while(i*2<=cd)
{
int son=i*2;
if(son<cd&&dis[dui[son+1]]<dis[dui[son]])
{
son++;
}
if(dis[dui[son]]<dis[dui[i]])
{
swap(dui[son],dui[i]);
i=son;
}
else break;
}
}
void add(int u,int v,int a)
{
cnt++;
nex[cnt]=head[u];
to[cnt]=v;
jg[cnt]=a;
head[u]=cnt;
}
int main()
{
scanf("%d%d%d%d%d",&N,&M,&K,&S,&T);
S++;T++;
int u,v,a;
for(int i=1;i<=M;i++)
{
scanf("%d%d%d",&u,&v,&a);
u++,v++;
add(u,v,a);add(v,u,a);
for(int j=1;j<=K;j++)
{
add(u+(j-1)*N,v+j*N,0);add(v+(j-1)*N,u+j*N,0);
add(u+j*N,v+j*N,a);add(v+j*N,u+j*N,a);
}
}
for(int i=1;i<=N+K*N;i++) dis[i]=0x7f7f7f7f;
dis[S]=0;
push(S);
while(cd)
{
int u=dui[1];
pop();
if(use[u]) continue;
else use[u]=1;
int tt=head[u],vv=to[tt];
while(vv)
{
if(dis[vv]>dis[u]+jg[tt])
{
dis[vv]=dis[u]+jg[tt];
push(vv);
}
//printf("%d!\n",vv);
tt=nex[tt],vv=to[tt];
}
}
int minn=0x7f7f7f7f;
for(int i=0;i<=K;i++) minn=min(minn,dis[T+i*N]);
printf("%d",minn);
}