比赛 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;
}