应该是循环错了,可能无限循环了,但是调了半天找不出来
#include<bits/stdc++.h>
using namespace std;
#define int long long
int to1[200020],nxt1[200020],w1[200020],head1[200020];
int to2[200020],nxt2[200020],w2[200020],head2[200020],tot2;
int tot1;
void add1(int x,int y,int v)
{
to1[tot1]=y;
w1[tot1]=v;
nxt1[tot1]=head1[x];
head1[x]=tot1++;
}//建正边
void add2(int x,int y,int v)
{
to2[tot2]=y;
w2[tot2]=v;
nxt2[tot2]=head2[x];
head2[x]=tot2++;
}//建反边
priority_queue<pair<int,int> > q1;
priority_queue<pair<int,int> > q2;
int dij1[200020],vis1[200020];
int dij2[200020],vis2[200020];
int n,m;
void dijkstra1(int s)
{
memset(dij1,0x3f,sizeof(dij1));
dij1[s]=0;
q1.push(make_pair(-dij1[s],s));
while(!q1.empty())
{
int x=q1.top().second;
q1.pop();
if(vis1[x])continue;
vis1[x]=1;
for(int j=head1[x];j!=-1;j=nxt1[x])
{
if(dij1[to1[j]]>dij1[x]+w1[j])
{
dij1[to1[j]]=dij1[x]+w1[j];
q1.push(make_pair(-dij1[to1[j]],to1[j]));
}
}
}
}//正边跑一遍堆优化dijkstra
void dijkstra2(int s)
{
memset(dij1,0x3f,sizeof(dij1));
dij2[s]=0;
q2.push(make_pair(-dij2[s],s));
while(!q2.empty())
{
int x=q2.top().second;
q2.pop();
if(vis2[x])continue;
vis2[x]=1;
for(int j=head2[x];j!=-1;j=nxt2[j])
{
if(dij2[to2[j]]>dij2[x]+w2[j])
{
dij2[to2[j]]=dij2[x]+w2[j];
q2.push(make_pair(-dij2[to2[j]],to2[j]));
}
}
}
}//反边跑一遍
signed main()
{
memset(head1,-1,sizeof(head1));
memset(head2,-1,sizeof(head2));
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v,ww;
cin>>u>>v>>ww;
add1(u,v,ww);
add2(v,u,ww);
}//存边
int ans=0;
dijkstra1(1);
dijkstra2(1);
for(int i=2;i<=n;i++)ans+=dij2[i]+dij1[i];//求和
cout<<ans;
}