题意 给定一张图,计算从1到各点的最短距离+各点到1的最短距离。
spfa即可,分别正向,反向建一个图。
水~
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<queue> 5 #include<algorithm> 6 using namespace std; 7 const int maxn = 1000005; 8 const int maxm = 1000015; 9 const int inf = 99999999; 10 int cnt1,cnt2,head1[ maxn ],head2[ maxn ]; 11 struct node{ 12 int u,val,next; 13 }edge1[ maxm ],edge2[ maxm ]; 14 int n,m; 15 int dis[ maxn ],vis[ maxn ]; 16 void init(){ 17 cnt1=cnt2=0; 18 memset( head1,-1,sizeof( head1 )); 19 memset( head2,-1,sizeof( head2 )); 20 //printf("%d\n",inf); 21 } 22 void addedge1( int a,int b,int c ){ 23 edge1[ cnt1 ].u=b; 24 edge1[ cnt1 ].val=c; 25 edge1[ cnt1 ].next=head1[ a ]; 26 head1[ a ]=cnt1++; 27 } 28 void addedge2( int a,int b,int c ){ 29 edge2[ cnt2 ].u=b; 30 edge2[ cnt2 ].val=c; 31 edge2[ cnt2 ].next=head2[ a ]; 32 head2[ a ]=cnt2++; 33 } 34 void spfa1( int s ){ 35 for( int i=1;i<=n;i++ ){ 36 dis[ i ]=inf; 37 vis[ i ]=0; 38 } 39 queue<int>q; 40 while( !q.empty() ) 41 q.pop(); 42 dis[ s ]=0; 43 vis[ s ]=1; 44 q.push( s ); 45 while( !q.empty() ){ 46 int now=q.front(); 47 q.pop(); 48 vis[ now ]=0; 49 for( int i=head1[ now ];i!=-1;i=edge1[ i ].next ){ 50 int next=edge1[ i ].u; 51 if( dis[ next ]>dis[ now ]+edge1[ i ].val ){ 52 dis[ next ]=dis[ now ]+edge1[ i ].val; 53 if( vis[ next ]==0 ){ 54 vis[ next ]=1; 55 q.push( next ); 56 } 57 } 58 } 59 } 60 return ; 61 } 62 void spfa2( int s ){ 63 for( int i=1;i<=n;i++ ){ 64 dis[ i ]=inf; 65 vis[ i ]=0; 66 } 67 queue<int>q; 68 while( !q.empty() ) 69 q.pop(); 70 dis[ s ]=0; 71 vis[ s ]=1; 72 q.push( s ); 73 while( !q.empty() ){ 74 int now=q.front(); 75 q.pop(); 76 vis[ now ]=0; 77 for( int i=head2[ now ];i!=-1;i=edge2[ i ].next ){ 78 int next=edge2[ i ].u; 79 if( dis[ next ]>dis[ now ]+edge2[ i ].val ){ 80 dis[ next ]=dis[ now ]+edge2[ i ].val; 81 if( vis[ next ]==0 ){ 82 vis[ next ]=1; 83 q.push( next ); 84 } 85 } 86 } 87 } 88 return ; 89 } 90 int main(){ 91 int ca; 92 scanf("%d",&ca); 93 while( ca-- ){ 94 init(); 95 scanf("%d%d",&n,&m); 96 int a,b,c; 97 while( m-- ){ 98 scanf("%d%d%d",&a,&b,&c); 99 addedge1( a,b,c ); 100 addedge2( b,a,c ); 101 } 102 int ans=0; 103 spfa1( 1 ); 104 //printf("spfa1:\n"); 105 for( int i=2;i<=n;i++ ){ 106 //printf("dis[%d]=%d \n",i,dis[i]); 107 ans+=dis[ i ]; 108 } 109 spfa2( 1 ); 110 //printf("spfa2:\n"); 111 for( int i=2;i<=n;i++ ){ 112 // printf("dis[%d]=%d \n",i,dis[i]); 113 ans+=dis[ i ]; 114 } 115 printf("%d\n",ans); 116 } 117 return 0; 118 }