首页 > 代码库 > POJ 1511 Invitation Cards(dijkstra+优先队列)

POJ 1511 Invitation Cards(dijkstra+优先队列)

题目链接:http://poj.org/problem?id=1511

题目大意:给你n个点,m条边(1<=n<=m<=1e6),每条边长度不超过1e9。问你从起点到各个点以及从各个点到起点的最小路程总和。

解题思路:这里用了优先队列优化的dijkstra复杂度mlogn,从起点到个点最短路径直接算就好了,算各个点到起点的最短路径,只要把边的方向反一下,再算一次从起点到个点最短路径就好了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<functional>
 5 #include<vector>
 6 #include<queue>
 7 using namespace std;
 8 typedef long long LL;
 9 typedef pair<int,int> p;
10 const int N=1e6+5;
11 const int INF=1<<30;//这里不能比1e9小 
12 struct edge{
13     int to,cost;
14 };
15 
16 vector<edge>eg[N];
17 int V,E;
18 bool used[N];
19 int d[N];
20 int a[N],b[N],c[N];
21 
22 void dijkstra(int s){
23     for(int i=1;i<=V;i++){
24         d[i]=INF;
25         used[i]=false;
26     }
27     d[s]=0;
28     
29     priority_queue<p,vector<p>,greater<p> >q;
30     q.push(p(0,s));
31     while(!q.empty()){
32         p p1=q.top();
33         q.pop();
34         int v=p1.second;
35         if(used[v])    continue;
36         used[v]=true;
37         for(int i=0;i<eg[v].size();i++){
38             edge e=eg[v][i];
39             if(d[e.to]>d[v]+e.cost){
40                 d[e.to]=d[v]+e.cost;
41                 q.push(p(d[e.to],e.to));
42             }
43         }
44     }
45 } 
46 
47 int main(){
48     int q;
49     scanf("%d",&q);
50     while(q--){
51         scanf("%d %d",&V,&E);
52         for(int i=1;i<=V;i++){
53             eg[i].clear();
54         }
55         for(int i=1;i<=E;i++){
56             scanf("%d%d%d",&a[i],&b[i],&c[i]);
57             edge gg;
58             gg.to=b[i],gg.cost=c[i];
59             eg[a[i]].push_back(gg);
60         }
61         dijkstra(1);
62         LL sum=0;
63         for(int i=1;i<=V;i++){
64             sum+=d[i];
65         }
66         //将边的方向反一下
67         for(int i=1;i<=V;i++){
68             eg[i].clear();
69         }
70         for(int i=1;i<=E;i++){
71             edge gg;
72             gg.to=a[i],gg.cost=c[i];
73             eg[b[i]].push_back(gg);
74         }
75         dijkstra(1);
76         for(int i=1;i<=V;i++){
77             sum+=d[i];
78         }
79         printf("%lld\n",sum);
80     }
81 }

 

POJ 1511 Invitation Cards(dijkstra+优先队列)