1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include<iostream> #include<cmath> #include<cstdio> #include<queue> #include<cstring>
using namespace std;
int n,m; int h1[2100000],h2[2100000]; int s1,s2; struct edge{ int next,to,dis; }; int v1[2100000],v2[2100000]; long long d1[2100000],d2[2100000]; edge e1[2100000],e2[2100000];
void addedge1(int next,int to,long long dis) { e1[++s1].dis=dis; e1[s1].next=h1[next]; e1[s1].to=to; h1[next]=s1; }
void addedge2(int next,int to,long long dis) { e2[++s2].dis=dis; e2[s2].to=to; e2[s2].next=h2[next]; h2[next]=s2; }
void dij1(int start) { priority_queue <pair<long long,int> > q; memset(d1,0x3f,sizeof(d1)); memset(v1,0,sizeof(v1)); q.push(make_pair(0,start)); d1[1]=0; while(!q.empty()) { int i,j; long long k; int t=q.top().second; q.pop(); if(v1[t]) continue; v1[t]=1; for(i=h1[t];i;i=e1[i].next) { j=e1[i].to; k=e1[i].dis; if(d1[t]+k<d1[j]) { d1[j]=d1[t]+k; q.push(make_pair(-d1[j],j)); } } } }
void dij2(int start) { priority_queue <pair<long long ,int> > q; memset(d2,0x3f,sizeof(d2)); memset(v2,0,sizeof(v2)); q.push(make_pair(0,start)); d2[1]=0; while(!q.empty()) { int i,j; long long k; int t=q.top().second; q.pop(); if(v2[t]) continue; v2[t]=1; for(i=h2[t];i;i=e2[i].next) { j=e2[i].to; k=e2[i].dis; if(d2[t]+k<d2[j]) { d2[j]=d2[t]+k; q.push(make_pair(-d2[j],j)); } } } }
int main() { int i,j; scanf("%d %d",&n,&m); for(i=1;i<=m;i++) { int t1,t2; long long t3; scanf("%d %d %lld",&t1,&t2,&t3); addedge1(t1,t2,t3); addedge2(t2,t1,t3); } long long tot=0; dij1(1); dij2(1); for(i=1;i<=n;i++) { tot+=d1[i]+d2[i]; } printf("%lld",tot); return 0; }
|