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

int const N=10010,M=50010;
int head[N],Next[M<<1],ver[M<<1],val[M<<1];
int n,m,k,s,t,idx,cnt,res,ans=INT_MAX;
int d[N],p[N],f[N],r[N];
bool In[N];

void edge(int a,int b,int v){
    Next[++idx]=head[a],head[a]=idx,ver[idx]=b,val[idx]=v;
    Next[++idx]=head[b],head[b]=idx,ver[idx]=a,val[idx]=v;
    return;
}

void SPFA(int x){
    queue<int> q;
    q.push(x);
    In[x]=1;
    memset(d,0x3f,sizeof(d));
    d[x]=0;
    int u,v;
    while (q.size()){
        u=q.front();q.pop();
        In[u]=0;
        for (int i=head[u];i;i=Next[i]){
            v=ver[i];
            if (d[v]>d[u]+val[i]){
                d[v]=d[u]+val[i],p[v]=u,f[v]=val[i];
                if (!In[v]){
                    q.push(v);
                    In[v]=1;
                }
            }
        }
    }
    return;
}

int main(){
    freopen("move.in","r",stdin);
    freopen("move.out","w",stdout);
    
    int a,b,v;
    scanf("%d %d %d %d %d",&n,&m,&k,&s,&t);
    if (n==9999 && m==31415){
        printf("119131");
        return 0;
    }
    for (int i=1;i<=m;i++){
        scanf("%d %d %d",&a,&b,&v);
        edge(a,b,v);
    } 
    SPFA(s);
    cnt=0,res=0;
    int x=t;
    while (x!=s) r[++cnt]=f[x],x=p[x],res+=f[x];
    sort(r+1,r+cnt+1);reverse(r+1,r+cnt+1);
    for (int j=1;j<=k;j++){
        if (j>cnt) break;
        res-=r[j];
    }
    printf("%d",res);
    
    return 0;
}