poj1511 最短路

题意:与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
",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 }
View Code
原文地址:https://www.cnblogs.com/cenariusxz/p/4785251.html