比赛 2024暑假C班集训A 评测结果 AAAAAAAAAA
题目名称 行动!行动! 最终得分 100
用户昵称 wdsjl 运行时间 0.340 s
代码语言 C++ 内存使用 11.68 MiB
提交时间 2024-07-10 11:19:29
显示代码纯文本
#include <bits/stdc++.h> 
using namespace std;

struct Edge{
    int to,next,cost;
}edge[2500001];
int cnt,head[510005];

void add_edge(int u,int v,int c=0){
    edge[++cnt]=(Edge){v,head[u],c};
    head[u]=cnt;
}

int dis[510005];
bool vis[510005];
void Dijkstra(int s){
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > points;
    points.push(make_pair(0,s));
    while(!points.empty()){
        int u=points.top().second;
        points.pop();
        if(!vis[u]){
            vis[u]=1;
            for(int i=head[u];i;i=edge[i].next){
                int to=edge[i].to;
                if(dis[to]>dis[u]+edge[i].cost){
                    dis[to]=dis[u]+edge[i].cost;
                    points.push(make_pair(dis[to],to));
                }
            }
        }
    }
}

int main(){
    freopen("move.in","r",stdin);
    freopen("move.out","w",stdout);
    int n,m,k,s,t;
    scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
    int u,v,c;
    for(int i=0;i<m;++i){
          scanf("%d%d%d",&u,&v,&c);
        add_edge(u,v,c);
        add_edge(v,u,c);
        for(int j=1;j<=k;++j){
            add_edge(u+(j-1)*n,v+j*n);
            add_edge(v+(j-1)*n,u+j*n);
            add_edge(u+j*n,v+j*n,c);
            add_edge(v+j*n,u+j*n,c);
        }
    }
    for(int i=1;i<=k;++i){
		add_edge(t+(i-1)*n,t+i*n);
	}
    Dijkstra(s);
    printf("%d",dis[t+k*n]);
    return 0;
}