题意:与poj3268一样,所有人需要从各点到一点再从一点到各点,求最短路总和。
与poj3268一样,先正向建图跑 dijkstra ,得到该点到其他所有各点的最短路,即这些人回去的最短路,再用反向建的图跑一遍最短路,得到各点到该点的最短路,求和就行了。
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<queue> 5 #include<vector> 6 using namespace std; 7 typedef pair<int,int> pii; 8 typedef long long ll; 9 const int MAXM=1000000; 10 struct cmp{ 11 bool operator ()(pii a,pii b){ 12 return a.first>b.first; 13 } 14 }; 15 16 int head1[MAXM+5],point1[MAXM+5],val1[MAXM+5],next1[MAXM+5],size1; 17 int head2[MAXM+5],point2[MAXM+5],val2[MAXM+5],next2[MAXM+5],size2; 18 int n,m; 19 int dist1[MAXM+5],dist2[MAXM+5]; 20 21 void add1(int a,int b,int v){ 22 point1[size1]=b; 23 val1[size1]=v; 24 next1[size1]=head1[a]; 25 head1[a]=size1++; 26 } 27 28 void add2(int a,int b,int v){ 29 point2[size2]=b; 30 val2[size2]=v; 31 next2[size2]=head2[a]; 32 head2[a]=size2++; 33 } 34 35 void dij(int s){ 36 int i; 37 priority_queue<pii,vector<pii>,cmp>q; 38 memset(dist1,0x3f,sizeof(dist1)); 39 memset(dist2,0x3f,sizeof(dist2)); 40 dist1[s]=dist2[s]=0; 41 q.push(make_pair(dist1[s],s)); 42 while(!q.empty()){ 43 pii u=q.top(); 44 q.pop(); 45 if(u.first>dist1[u.second])continue; 46 for(i=head1[u.second];~i;i=next1[i]){ 47 int j=point1[i]; 48 if(dist1[j]>dist1[u.second]+val1[i]){ 49 dist1[j]=dist1[u.second]+val1[i]; 50 q.push(make_pair(dist1[j],j)); 51 } 52 } 53 } 54 while(!q.empty())q.pop(); 55 q.push(make_pair(dist2[s],s)); 56 while(!q.empty()){ 57 pii u=q.top(); 58 q.pop(); 59 if(u.first>dist2[u.second])continue; 60 for(i=head2[u.second];~i;i=next2[i]){ 61 int j=point2[i]; 62 if(dist2[j]>dist2[u.second]+val2[i]){ 63 dist2[j]=dist2[u.second]+val2[i]; 64 q.push(make_pair(dist2[j],j)); 65 } 66 } 67 } 68 ll ans=0; 69 for(i=1;i<=n;i++){ 70 ans+=dist1[i]; 71 ans+=dist2[i]; 72 } 73 printf("%I64d\n",ans); 74 } 75 76 int main(){ 77 int t; 78 scanf("%d",&t); 79 for(int q=1;q<=t;q++){ 80 scanf("%d%d",&n,&m); 81 int i,a,b,v; 82 memset(head1,-1,sizeof(head1)); 83 size1=0; 84 memset(head2,-1,sizeof(head2)); 85 size2=0; 86 for(i=1;i<=m;i++){ 87 scanf("%d%d%d",&a,&b,&v); 88 add1(a,b,v); 89 add2(b,a,v); 90 } 91 dij(1); 92 } 93 94 return 0; 95 }
时间: 2024-08-28 14:05:24