首页 > 代码库 > 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+优先队列)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。