比赛 |
2024暑假C班集训A |
评测结果 |
WWWWAAAAAW |
题目名称 |
行动!行动! |
最终得分 |
50 |
用户昵称 |
djyqjy |
运行时间 |
0.324 s |
代码语言 |
C++ |
内存使用 |
10.69 MiB |
提交时间 |
2024-07-10 09:28:14 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=10010,M=50010,K=12;
int n,m,k;
int s,t;
int ver[4*M*K],hd[N*K],nxt[4*M*K],edge[4*M*K];
int jsq=1;
long long dis[N*K];
bool mark[N*K];
void add(int x,int y,int val)
{
ver[++jsq]=y;
edge[jsq]=val;
nxt[jsq]=hd[x];
hd[x]=jsq;
return;
}
priority_queue <pair<long long,int> > q;
void dij()
{
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
q.push(make_pair(-dis[s],s));
for(int i=1;i<=n*k;i++)
{
long long d;
int dx;
while(1)
{
d=-q.top().first;
dx=q.top().second;
q.pop();
if(mark[dx]==0)
{
break;
}
}
mark[dx]=1;
for(int j=hd[dx];j;j=nxt[j])
{
int y=ver[j];
if(mark[y]==0&&dis[y]>d+edge[j])
{
dis[y]=d+edge[j];
q.push(make_pair(-dis[y],y));
}
}
}
return;
}
int main()
{
freopen("move.in","r",stdin);
freopen("move.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d",&s,&t);
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
for(int j=1;j<=k;j++)
{
add(a+j*n,b+j*n,c);
add(b+j*n,a+j*n,c);
add(a+(j-1)*n,b+j*n,0);
add(b+(j-1)*n,a+j*n,0);
}
}
dij();
long long ans=0x7fffffffffffffff;
for(int j=0;j<=k;j++)
{
ans=min(ans,dis[t+j*n]);
}
printf("%lld",ans);
return 0;
}