题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3790

分析:dijkstra没有优化的话,复杂度是n*n,优化后的复杂度是m*logm,n是顶点数,m是边数,所以当边的个数少于n*n时优化后算法效率大大提升,如果大于的话就不能用堆优化了。同时spaf的复杂度比较玄学,尽量不要去使用spaf,我在一道n=3e5,m=3e5的题中使用spaf超时。

AC代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<queue>
  4. #include<cstring>
  5. using namespace std;
  6. const int maxn=1010,maxm=2*100000+10;
  7. const int INF=1e9+10;
  8. bool ins[maxn];
  9. int dis[maxn],mon[maxn];
  10. int to[maxm],w[maxm],g[maxm],fa[maxn],nex[maxm];
  11. int cnt,n,m;
  12. struct Node{
  13. int x,w,g;
  14. bool operator < (const Node &a)const
  15. {
  16. if(w!=a.w)
  17. return w>a.w;
  18. else return g>a.g;
  19. }
  20. Node(int _x,int _w,int _g):x(_x),w(_w),g(_g){}
  21. };
  22. void add(int a,int b,int c,int d)
  23. {
  24. cnt++;
  25. to[cnt]=b;
  26. w[cnt]=c;
  27. g[cnt]=d;
  28. nex[cnt]=fa[a];
  29. fa[a]=cnt;
  30. }
  31. void spfa(int s,int t)
  32. {
  33. priority_queue<Node>que;
  34. que.push(Node(s,0,0));
  35. for(int i=1;i<=n;i++)
  36. dis[i]=INF,mon[i]=INF;
  37. dis[s]=0,mon[s]=0;
  38. while(que.size())
  39. {
  40. Node now =que.top();
  41. que.pop();
  42. if(ins[now.x])continue;
  43. ins[now.x]=1;
  44. for(int i=fa[now.x];i;i=nex[i])
  45. {
  46. int k=to[i];
  47. if(ins[k])continue;
  48. if(dis[k]>now.w+w[i])
  49. {
  50. dis[k]=now.w+w[i];
  51. mon[k]=now.g+g[i];
  52. que.push(Node(k,dis[k],mon[k]));
  53. }
  54. else if(dis[k]==now.w+w[i]&&mon[k]>now.g+g[i])
  55. {
  56. mon[k]=now.g+g[i];
  57. que.push(Node(k,dis[k],mon[k]));
  58. }
  59. }
  60. }
  61. printf("%d %d\n",dis[t],mon[t]);
  62. }
  63. int main()
  64. {
  65. int s,t;
  66. while(scanf("%d %d",&n,&m)==2)
  67. {
  68. if(n==0&&m==0)break;
  69. cnt=0;
  70. memset(ins,0,sizeof(ins));
  71. memset(fa,0,sizeof(fa));
  72. for(int i=1;i<=m;i++)
  73. {
  74. int a,b,c,d;
  75. scanf("%d %d %d %d",&a,&b,&c,&d);
  76. add(a,b,c,d);
  77. add(b,a,c,d);
  78. }
  79. scanf("%d %d",&s,&t);
  80. spfa(s,t);
  81. }
  82. }

  

hdu3790 dijkstra+堆优化的更多相关文章

  1. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  2. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  3. POJ2387(dijkstra堆优化)

    Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to get as much s ...

  4. hdu 2544 单源最短路问题 dijkstra+堆优化模板

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  5. 深入理解dijkstra+堆优化

    深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra   对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...

  6. dijkstra堆优化(multiset实现->大大减小代码量)

    例题: Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣 ...

  7. POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化

    昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...

  8. Dijkstra堆优化学习

    最短路径例题 今天特地学习了Dijkstra的堆优化(主要是慕名已久). 我们需要一个堆来记录[编号,到编号这个点的最短路径值(当然只是当前的)] 与原来的Dijkstra操作基本一致,主要有以下几点 ...

  9. 【Dijkstra堆优化】洛谷P2243电路维修

    题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和James,可是一直也没能给 ...

随机推荐

  1. python连接sqlserver数据库

    1.准备工作 python3.6连接sqlserver数据库需要引入pymssql模块 pymssql官方:https://pypi.org/project/pymssql/ 没有安装的话需要: pi ...

  2. Lua中的#

    Lua中的 对字符串来说,#取字符串的长度,但对于table需要注意. lua的table可以用数字或字符串等作为key, #号得到的是用整数作为索引的最开始连续部分的大小, 如果t[1] == ni ...

  3. tomcat启动超过时间

    Server Tomcat v9.0 Server at localhost was unable to start within 45 seconds. 运行超时 最近我切换了JDK版本之后,将10 ...

  4. ionic app开发遇到的问题

    :processDebugResources FAILED FAILURE: Build failed with an exception. * What went wrong: Execution ...

  5. baidu.com跳转www.baidu.com

    打开git bash,输入 curl baidu.com,收到返回 <html> <meta http-equiv="refresh" content=" ...

  6. 【HNOI2016】树

    [HNOI2016]树 题目描述 每一个复制过来的子树(我们称为一个树团)有用的只有需要被访问的节点,包括根,根的父亲,要询问的点.我们只需要求出这些点到其所在树团根的距离以及倍增数组就好了. 需要讨 ...

  7. Mysql 数据库设置三大范式 数据库五大约束 数据库基础配置

    数据库设置三大范式 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式. 第一范式的合理遵循需要根据系统给的实际需求 ...

  8. Rancher2-----了解什么是rancher以及简单部署

    个人理解:就是相当于openstack的图形化界面,或者说应用程序的图形化界面,rancher功能就是在图形化界面去管理容器,包括运行容器,创建网络,存储等:rancher有个应用商店,可以根据自己的 ...

  9. centos7下安装docker(17.3docker监控---cAdvisor)

    cAdvisor是google开发的容器监控工具 1.在host上运行cadvisor容器 docker run -d -p 8080:8080 --name cadvisor -v /:/rootf ...

  10. 数组长度为len,数组元素的范围是0到len-1,找出数组的重复元素

    public static int findDuplicate(int[] nums) { int len = nums.length; //注意这里的for循环写法,在交换元素后,i没有增加,还要继 ...