可能写的有些繁琐,望谅解
#include <bits/stdc++.h>
#define m_p make_pair
using namespace std;
typedef pair<int,int> pix;
int n,m;
struct cmp{
bool operator()(const pix a,const pix b){
return a.first>b.first;
}
};
struct ntoe{
int v,w,next;
}e[1000100];
struct nott{
int v,w,next;
}e2[1000100];
int head[1000100],k = 1;
int head2[1000100],k2 = 1;
void add(int u,int v,int w){
e[k].v = v;
e[k].w = w;
e[k].next = head[u];
head[u] = k++;
}
void add2(int u,int v,int w){
e2[k2].v = v;
e2[k2].w = w;
e2[k2].next = head2[u];
head2[u] = k2++;
}
int dis[1000100];
int dis2[1000100];
bool vis2[1000100];
bool vis[1000100];
void dij(int s){
for(int i =1;i<=n;i++){
dis[i] = 0x3f3f3f3f;
}
dis[s] = 0;
priority_queue<pix,vector<pix>,cmp> q;
q.push(m_p(dis[s],s));
while(!q.empty()){
pix tmp = q.top();
q.pop();
// cout<<tmp.first<<" "<<tmp.second<<endl;
int u = tmp.second;
if(vis[u])continue;
vis[u] =1;
for(int i = head[u];i!=0;i=e[i].next){
int v= e[i].v;
int w = e[i].w;
if(dis[v]>dis[u]+w){
dis[v] = dis[u]+w;
q.push(m_p(dis[v],v));
}
}
}
return;
}
void dij2(int s){
for(int i = 1;i<=n;i++){
dis2[i] = 0x3f3f3f3f;
}
dis2[s] = 0;
priority_queue<pix,vector<pix>,cmp> q2;
q2.push(m_p(dis2[s],s));
while(!q2.empty()){
pix tmp = q2.top();
q2.pop();
int u = tmp.second;
if(vis2[u])continue;
vis2[u] = 1;
for(int i =head2[u];i != 0;i = e2[i].next){
int v = e2[i].v;
int w = e2[i].w;
if(dis2[v]>dis2[u]+w){
dis2[v] = dis2[u]+w;
q2.push(m_p(dis2[v],v));
}
}
}
return ;
}
int main(){
int s;
cin>>n>>m;
s = 1;
for(int i = 1;i<=m;i++){
int t1,t2,t3;
scanf("%d%d%d",&t1,&t2,&t3);
add(t1,t2,t3);
add2(t2,t1,t3);
}
dij(s);
dij2(s);
long long ans;
for(int i =1;i<=n;i++){
ans+=dis[i];
// cout<<dis[i]<<":"<<dis2[i]<<" "<<endl;
ans+=dis2[i];
}
cout<<ans;
return 0;
}