rt,代码如下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,c,u,v,d,dis[200005],head[200005],tot,sum,ans;
struct edge{ll from,to,nxt,val;}e[400005];
inline void add(ll u,ll v,ll w){
e[++tot]=(edge){u,v,head[u],w};
head[u]=tot;
}
bool vis[200005];
inline void spfa(ll x){
memset(dis,0x3f,sizeof(dis));
queue<ll>q;
q.push(x),vis[x]=1,dis[x]=0;
while(!q.empty()){
ll u=q.front();q.pop();vis[u]=0;
for(ll i=head[u];i;i=e[i].nxt){
ll v=e[i].to;
if(dis[u]+e[i].val<dis[v]){
dis[v]=dis[u]+e[i].val;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
}
struct edgedis{ll mdis,id;}mp[200005];
signed main(){
scanf("%d%d%d",&n,&m,&c);
for(ll i=1;i<=m;++i){
scanf("%d%d%d",&u,&v,&d);
add(u,v,d),add(v,u,d),sum+=d;
}
spfa(1),ans=sum;
for(ll i=1;i<=m;++i){
mp[i].mdis=max(dis[e[i*2-1].from],dis[e[i*2-1].to]),mp[i].id=i*2-1;
}
sort(mp+1,mp+m+1,[](edgedis a,edgedis b){return a.mdis<b.mdis;});
for(ll i=1;i<=m;++i){
sum-=e[mp[i].id].val;
ans=min(ans,mp[i].mdis*c+sum);
++tot;
}
printf("%lld",ans);
}
这份代码通过了所有样例和学校OJ的测试,但是在atcoder上全WA.