hdu3790 dijkstra+堆优化
题目来源: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代码:
- #include<cstdio>
- #include<iostream>
- #include<queue>
- #include<cstring>
- using namespace std;
- const int maxn=1010,maxm=2*100000+10;
- const int INF=1e9+10;
- bool ins[maxn];
- int dis[maxn],mon[maxn];
- int to[maxm],w[maxm],g[maxm],fa[maxn],nex[maxm];
- int cnt,n,m;
- struct Node{
- int x,w,g;
- bool operator < (const Node &a)const
- {
- if(w!=a.w)
- return w>a.w;
- else return g>a.g;
- }
- Node(int _x,int _w,int _g):x(_x),w(_w),g(_g){}
- };
- void add(int a,int b,int c,int d)
- {
- cnt++;
- to[cnt]=b;
- w[cnt]=c;
- g[cnt]=d;
- nex[cnt]=fa[a];
- fa[a]=cnt;
- }
- void spfa(int s,int t)
- {
- priority_queue<Node>que;
- que.push(Node(s,0,0));
- for(int i=1;i<=n;i++)
- dis[i]=INF,mon[i]=INF;
- dis[s]=0,mon[s]=0;
- while(que.size())
- {
- Node now =que.top();
- que.pop();
- if(ins[now.x])continue;
- ins[now.x]=1;
- for(int i=fa[now.x];i;i=nex[i])
- {
- int k=to[i];
- if(ins[k])continue;
- if(dis[k]>now.w+w[i])
- {
- dis[k]=now.w+w[i];
- mon[k]=now.g+g[i];
- que.push(Node(k,dis[k],mon[k]));
- }
- else if(dis[k]==now.w+w[i]&&mon[k]>now.g+g[i])
- {
- mon[k]=now.g+g[i];
- que.push(Node(k,dis[k],mon[k]));
- }
- }
- }
- printf("%d %d\n",dis[t],mon[t]);
- }
- int main()
- {
- int s,t;
- while(scanf("%d %d",&n,&m)==2)
- {
- if(n==0&&m==0)break;
- cnt=0;
- memset(ins,0,sizeof(ins));
- memset(fa,0,sizeof(fa));
- for(int i=1;i<=m;i++)
- {
- int a,b,c,d;
- scanf("%d %d %d %d",&a,&b,&c,&d);
- add(a,b,c,d);
- add(b,a,c,d);
- }
- scanf("%d %d",&s,&t);
- spfa(s,t);
- }
- }
hdu3790 dijkstra+堆优化的更多相关文章
- POJ 2502 - Subway Dijkstra堆优化试水
做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...
- Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路
2834: 回家的路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 62 Solved: 38[Submit][Status][Discuss] D ...
- 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 ...
- hdu 2544 单源最短路问题 dijkstra+堆优化模板
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 深入理解dijkstra+堆优化
深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra 对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...
- dijkstra堆优化(multiset实现->大大减小代码量)
例题: Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣 ...
- POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化
昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...
- Dijkstra堆优化学习
最短路径例题 今天特地学习了Dijkstra的堆优化(主要是慕名已久). 我们需要一个堆来记录[编号,到编号这个点的最短路径值(当然只是当前的)] 与原来的Dijkstra操作基本一致,主要有以下几点 ...
- 【Dijkstra堆优化】洛谷P2243电路维修
题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和James,可是一直也没能给 ...
随机推荐
- python连接sqlserver数据库
1.准备工作 python3.6连接sqlserver数据库需要引入pymssql模块 pymssql官方:https://pypi.org/project/pymssql/ 没有安装的话需要: pi ...
- Lua中的#
Lua中的 对字符串来说,#取字符串的长度,但对于table需要注意. lua的table可以用数字或字符串等作为key, #号得到的是用整数作为索引的最开始连续部分的大小, 如果t[1] == ni ...
- tomcat启动超过时间
Server Tomcat v9.0 Server at localhost was unable to start within 45 seconds. 运行超时 最近我切换了JDK版本之后,将10 ...
- ionic app开发遇到的问题
:processDebugResources FAILED FAILURE: Build failed with an exception. * What went wrong: Execution ...
- baidu.com跳转www.baidu.com
打开git bash,输入 curl baidu.com,收到返回 <html> <meta http-equiv="refresh" content=" ...
- 【HNOI2016】树
[HNOI2016]树 题目描述 每一个复制过来的子树(我们称为一个树团)有用的只有需要被访问的节点,包括根,根的父亲,要询问的点.我们只需要求出这些点到其所在树团根的距离以及倍增数组就好了. 需要讨 ...
- Mysql 数据库设置三大范式 数据库五大约束 数据库基础配置
数据库设置三大范式 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式. 第一范式的合理遵循需要根据系统给的实际需求 ...
- Rancher2-----了解什么是rancher以及简单部署
个人理解:就是相当于openstack的图形化界面,或者说应用程序的图形化界面,rancher功能就是在图形化界面去管理容器,包括运行容器,创建网络,存储等:rancher有个应用商店,可以根据自己的 ...
- centos7下安装docker(17.3docker监控---cAdvisor)
cAdvisor是google开发的容器监控工具 1.在host上运行cadvisor容器 docker run -d -p 8080:8080 --name cadvisor -v /:/rootf ...
- 数组长度为len,数组元素的范围是0到len-1,找出数组的重复元素
public static int findDuplicate(int[] nums) { int len = nums.length; //注意这里的for循环写法,在交换元素后,i没有增加,还要继 ...