Dijkstra堆优化+邻接表】的更多相关文章

Dijkstra算法是个不错的算法,但是在优化前时间复杂度太高了,为O(nm). 在经过堆优化后(具体实现用的c++ STL的priority_queue),时间复杂度为O((m+n) log n),下面给出代码. #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=100010,M=100010;//N:…
dijkstra本身每次要for一遍,才能找出最小的节点,但用了堆之后,直接取出堆首就可以了. 但要注意的一点是,c++自带的stl里的priority_queue本身是先入大出的,而我们要求的是最小值,所以我们在push的时候是插入负数,这样就能保证是先入小出的了 代码如下: 各种定义: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<…
例题: Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被雇来分发这些请柬.每个学生志愿者被指定一个确切的公共汽车站,他或她将留在那里一整天,邀请人们参与. 这里的公交系统是非常特殊的:所有的线路都是单向的,连接两个站点.公共汽车离开起始点,到达目的地之后又空车返回起始点.…
做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 -> n - 1 d[i] = dis[0][i] while u = GetNearest(1 .. n - 1, !been[]) been[u] = 1 for_each edge from u d[edge.v] = min(d[edge.v], d[u] + dis[u][edge.v]…
2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] Description Input Output Sample Input 2 1 1 2 1 1 2 2 Sample Output 5 HINT N<=20000,M<=100000 Source dijkstra+堆优化+分层图 把所有的横向和纵向分开看.跑最短路即可. 注意:N这么大,不能写…
Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the morning milking. Bessie needs her beauty sleep, so she wants to get back as quickly as possible.…
最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41168    Accepted Submission(s): 17992 Problem Description 在每年的校赛里.全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的.所以如今他们想要寻…
深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra   对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出),给定a和b,求a到b的最短路,保证a一定能够到达b.这条最短路是否一定存在呢?答案是肯定的.相反,最长路就不一定了,由于边权为正,如果遇到有环的时候,可以一直在这个环上走,因为要找最长的,这样就使得路径越变越长,永无止境,所以对于正权图,在可达的情况下最短路一定存在,最长路则不一定存在.这里先讨论正…
昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [1000000] 导致 struct 爆栈,此问题亟待解决.. 实力碾压SPFA 2500 ms,有图为证 #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #d…
昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外给出邻接表存储实现的操作,唉,真是令人窒息...... 言归正传吧,毕竟我这么菜,也不会讲什么大道理...... 呜哇呜哇.jpg 原题链接 本题大意:给定n结点,a和b表示其中的两个结点,输出t组a和b和w表示a和b距离w可以互相抵达,求从n走到1的最短路径... 本题思路:建图之后直接单源最短路…
其实堆优化版极其的简单,只要知道之前的Dijkstra怎么做,那么堆优化版就完全没有问题了. 在做之前,我们要先学会优先队列,来完成堆的任务,下面盘点了几种堆的表示方式. priority_queue< pair<int,int> >q;// 这就是本程序要用的两个量的堆,当然这是大根堆,排的是第一个 q.qush(make_pair(,));//在程序中是这么用的,大根堆排序的是0 int x=q.top().second;//取第二个元素 int x=q.top().first…
Dijkstra是一个非常不错的最短路算法,它使用两层循环进行枚举,通过每次更新蓝白点的方式更新最短路,时间复杂度为O(n^2),优于floyd的O(n^3),不过只能用于计算单源最短路,而且无法处理负权边. 今天我们尝试用堆来优化它.这里我们使用了STL中的set和pair.set本身相当于一个小根堆,内部自动从小到大排序.(据说内部使用平衡树实现?蒟蒻瑟瑟发抖.)操作方式大致就是insert(插入)和erase(删除),不过他会把相同的数据融合到一起,如果不想这样可以使用multiset.对…
朴素Dijkstra 是一种基于贪心的算法. 稠密图使用二维数组存储点和边,稀疏图使用邻接表存储点和边. 算法步骤: 1.将图上的初始点看作一个集合S,其它点看作另一个集合 2.根据初始点,求出其它点到初始点的距离dist[i] (若相邻,则dist[i]为边权值:若不相邻,则dist[i]为无限大) 3.选取最小的dist[i](记为dist[x]),并将此dist[i]边对应的点(记为x)加入集合S(实际上,加入集合的这个点的dist[x]值就是它到初始点的最短距离) 4.再根据x,更新跟…
最短路径例题 今天特地学习了Dijkstra的堆优化(主要是慕名已久). 我们需要一个堆来记录[编号,到编号这个点的最短路径值(当然只是当前的)] 与原来的Dijkstra操作基本一致,主要有以下几点: 1.将起点放入堆中 2.开始while循环 3.取出堆顶 4.如果已经拓展过就continue 5.松弛操作同时满足条件放入堆 6.repeat step3 code: #include <cstdio> #include <queue> #include <vector&g…
题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和James,可是一直也没能给他们帮上什么忙. 题目描述 有一天 Mark 和James 的飞行车没有办法启动了,经过检查发现原来是电路板的故障.飞行车的电路板设计很奇葩,如下图所示: 输入输出格式 输入格式: 输入文件包含多组测试数据.第一行包含一个整数T 表示测试数据的数目. 对于每组测试数据,第一行包含正整数 R 和C,表…
题目来源: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> #i…
E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Little girl Susie accidentally found her elder brother's notebook. She has many things to do, more important than solving…
许久没有写博客,更新一下~ Dijkstra两种典型写法 1. 朴素Dijkstra     时间复杂度O(N^2)       适用:稠密图(点较少,分布密集) #include <cstdio> #include <iostream> #include <cstring> using namespace std; ; int n, m; int g[N][N], dist[N]; bool st[N]; int dijkstra() { memset(dist, 0…
题目链接:http://poj.org/problem?id=1511 题目大意:给你n个点,m条边(1<=n<=m<=1e6),每条边长度不超过1e9.问你从起点到各个点以及从各个点到起点的最小路程总和. 解题思路:这里用了优先队列优化的dijkstra复杂度mlogn,从起点到个点最短路径直接算就好了,算各个点到起点的最短路径,只要把边的方向反一下,再算一次从起点到个点最短路径就好了. Dijkstra: #include<iostream> #include<cs…
Dijkstra+优先队列 #include<cstdio> #include<cctype> #include<queue> #include<cstring> #include<algorithm> #include<queue> using namespace std; inline int read() { ,f=;char c=getchar(); ; +c-'; return x*f; } ; ; struct Dijks…
qwq dij其实和prim挺像的,prim是找权值最小点,dij是找边, 用一个优先队列就可以在加入边的时候直接排序,避免了每次遍历更新min priority_queue <pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q; 这句话就能把大根堆转化为小根堆(pair中的第一个值first最小的在最上面), 同时pair<边权,序号>便于在对…
复杂度O(mlogn) 输入起点s,可以得到从起点到各点的最短路距离数组dis[i] 过程: 1.初始化:清空标记数组,初始化距离数组设为inf,起点距离设为0,开优先队列,搜索起点 2.搜索:取出队首并pop,如果队首节点u的当前最短路比u的原先的最短路大则跳过,否则遍历u的邻接点如果v没有被访问过且u的最短路加上当前邻接边边权小于原先v的最短路,则更新v的最短路且搜索v 3.注意:在bool operator(const node &a)const{return a.w<w;}中是要a.…
#include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> #define inf 2147483647 using namespace std; struct data { int from,to,next,w; data(){,to=-,next=-,w=-;} }e[]; str…
借bzoj1624练了一下模板(虽然正解只是floyd) spfa: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> #include <queue> using namespace std; const int INF=100001; const int maxm=10001,maxn=10…
题目链接:https://www.nowcoder.com/acm/contest/203/I?tdsourcetag=s_pcqq_aiomsg来源:牛客网 思路:我们用用fa[i]表示距离i最近的大都市,dis[i]表示i距离该大都市的距离.我们先把所有大都市加入初始点,然后跑Dijkstra,如果某一点到另一个大都市距离更近,那么更新dis和fa.如果取边时,边的两边分别属于不同的两个大都市,说明两个大都市连通了,那么更新答案. 代码: #include<set> #include<…
题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 100→60: Ag→Cu: 最终,他因此没能与理想的大学达成契约. 小 F 衷心祝愿大家不再重蹈覆辙. 题目描述 给定一个 N 个点,M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离. 数据保证你能从 S 出发到任意点. 输入输出格式 输入格式: 第一行为三个正整数 N, M, S. 第二行起 M 行,每行三个非负整数 ,表示从 到 …
demo: #include<bits/stdc++.h> #define max_v 102000 #define inf 0x3f3f3f3f using namespace std; typedef long long ll; struct edge{int to,cost;}; typedef pair<int,int> P; int V; vector<edge>G[max_v]; int d[max_v]; void dijkstra(int s){ pri…
咕咕咕. #include<queue> #include<cstdio> #include<cstring> #include<algorithm> #define mk make_pair #define ll long long using namespace std; inline ll read()//快读 { ll sum = ,p = ; char ch = getchar(); ') { if(ch == '-') p = -; ch = g…
题目背景 2018 年7月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 最终,他因此没能与理想的大学达成契约. 小 F 衷心祝愿大家不再重蹈覆辙. 题目描述 给定一个 n 个点,m 条有向边的带非负权图,请你计算从 s 出发,到每个点的距离. 数据保证你能从 s 出发到任意点. 输入格式 第一行为三个正整数 n, m, s. 第二行起 m 行,每行三个非负整数 ui​,vi​,wi​,表示ui​ 到vi​ 有一条权值为wi​ 的有向边…
高玩小Q不仅喜欢玩寻宝游戏,还喜欢一款升级养成类游戏.在这个游戏的世界地图中一共有nn个城镇,编号依次为11到nn.这些城镇之间有mm条单向道路,第ii 条单项道路包含四个参数ui,vi,ai,biui,vi,ai,bi,表示一条从uiui号城镇出发,在vivi号城镇结束的单向道路,因为是单向道路,这不意味着小Q可以从vivi沿着该道路走到uiui.小Q的初始等级levellevel为11,每当试图经过一条道路时,需要支付cost=log2level+ailevelcost=log2⁡level…