标签:
Time Limit: 8000MS | Memory Limit: 262144K | |
Total Submissions: 22277 | Accepted: 7298 |
Description
Input
Output
Sample Input
2 2 2
1 2 13
2 1 33
4 6
1 2 10
2 1 60
1 3 20
3 4 10
2 4 5
4 1 50
Sample Output
46 210
1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <algorithm> 5 #include <cstring> 6 #include <fstream> 7 8 using namespace std; 9 10 #define MAXN 1000100 11 #define inf 1LL<<60 12 13 int head1[MAXN],head2[MAXN]; 14 __int64 dist[MAXN]; 15 bool used[MAXN]; 16 int n,m,cnt; 17 18 struct Edge 19 { 20 int to; 21 int cost; 22 int next; 23 } edge_1[MAXN*10],edge_2[MAXN*10]; 24 25 void insert(Edge* edge,int* head,int u,int v,int w) 26 { 27 edge[cnt].to = v; 28 edge[cnt].cost = w; 29 edge[cnt].next = head[u]; 30 head[u] = cnt; 31 } 32 33 __int64 Spfa(Edge* edge,int* head,int u) 34 { 35 memset(used,false,(n+2)*sizeof(bool)); 36 for(int i=1; i<=n; i++)dist[i]=inf; 37 dist[u]=0; 38 queue<int>Q; 39 Q.push(u); 40 while(!Q.empty()) 41 { 42 u=Q.front(); 43 Q.pop(); 44 used[u]=false; 45 for(int i=head[u]; i!=-1; i=edge[i].next) 46 { 47 int v=edge[i].to,w=edge[i].cost; 48 if(dist[u]+w<dist[v]) 49 { 50 dist[v]=dist[u]+w; 51 if(!used[v]) 52 { 53 used[v]=true; 54 Q.push(v); 55 } 56 } 57 } 58 } 59 long long ans=0; 60 for(int i=2; i<=n; i++) 61 ans+=dist[i]; 62 return ans; 63 } 64 65 66 int main() 67 { 68 // freopen("in.txt","r",stdin); 69 int _case; 70 scanf("%d",&_case); 71 while(_case--) 72 { 73 scanf("%d%d",&n,&m); 74 cnt = 0; 75 memset(head1,-1,(n+2)*sizeof(int)); 76 memset(head2,-1,(n+2)*sizeof(int)); 77 while(m--) 78 { 79 int u,v,w; 80 scanf("%d%d%d",&u,&v,&w); 81 insert(edge_1,head1,u,v,w); 82 insert(edge_2,head2,v,u,w); 83 cnt++; 84 } 85 __int64 ans = Spfa(edge_1,head1,1) + Spfa(edge_2,head2,1); 86 cout << ans << endl; 87 } 88 return 0; 89 }
标签:
原文地址:http://www.cnblogs.com/cjshuang/p/4744667.html