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