关系链先存着,正着跑一边,然后清空,然后关系链反正跑一边,加起来就是答案了- -记得要scanf,不然超时
#include "bits/stdc++.h"
using namespace std;
const int maxx=1e6+5;
const int maxn=0x3f3f3f3f;
int n,m,v1,u1,w1;
int ans[maxx];
int vis[maxx];
int head[maxx];
struct Edge{
int to,next,w;
}edge[maxx*2];
int cnt=0;
void init(){
memset(vis,0,sizeof vis);
memset(head,-1,sizeof(head));
cnt=0;
for(int i=1;i<=n;i++){
ans[i]=maxn;
}
}
void add_edge(int v,int u,int w){
edge[cnt].to=u;
edge[cnt].next=head[v];
edge[cnt].w=w;
head[v]=cnt++;
}
struct cmp{
bool operator()(pair<int,int>a,pair<int,int>b){
return a.first>b.first;
}
};
void djstl(int x){
priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> q;
q.push({0,x});
ans[x]=0;
while (!q.empty()){
int top=q.top().second;
vis[top]=1;
q.pop();
for(int i=head[top];i!=-1;i=edge[i].next){
if(vis[edge[i].to]==0&&ans[edge[i].to]>ans[top]+edge[i].w){
ans[edge[i].to]=ans[top]+edge[i].w;
q.push({ans[edge[i].to],edge[i].to});
}
}
}
}
Edge zhi[maxx];
int main(){
int cs;
while (scanf("%d",&cs)!=EOF){
while(cs--){
scanf("%d%d",&n,&m);
init();
for(int i=0;i<m;i++){
scanf("%d%d%d",&zhi[i].to,&zhi[i].next,&zhi[i].w);
add_edge(zhi[i].to,zhi[i].next,zhi[i].w);
}
djstl(1);
long long ans1=0;
for(int i=2;i<=n;i++){
ans1+=ans[i];
}
init();
for(int i=0;i<m;i++){
add_edge(zhi[i].next,zhi[i].to,zhi[i].w);
}
djstl(1);
for(int i=2;i<=n;i++){
ans1+=ans[i];
}
printf("%d\n",ans1);
}
}
return 0;
}