dijkstra

Dijkstra

好久不见. 提交于 2019-11-28 00:08:42
Dijkstra 思路:每一次枚举当前没有枚举过的 d[] 值最小的点 x ,然后对该结点进行标记,然后再分别遍历 x 的每一条边,用 d[x] 去更新 d[y] , d[y]=min(d[y],d[x]+w[x][y]) , w[x][y] 表示 x 与 y 之间的边的权重,具体 Dijkstra 的结构实际上是跟 bfs 差不多的,可以利用一个优先队列来对 Dijkstra 进行优化。 模板题: [JLOI2011]飞行路线 参考:[模板题: [JLOI2011]飞行路线]]( https://oi-wiki.org/graph/shortest-path/#91jloi201193 ) 代码: // Created by CAD on 2019/8/20. #include <bits/stdc++.h> #define INF 0x3f3f3f3f3f #define mst(name, value) memset(name,value,sizeof(name)) #define ll long long using namespace std; const int maxn=5e4+5; int head[maxn],cnt=0,d[maxn][20],s,t,k; bool vis[10005][20]; //这个不能开得过大不然会t struct edge{ int

Dijkstra迪杰斯特拉算法

让人想犯罪 __ 提交于 2019-11-27 22:17:12
迪杰斯特拉算法是用于求解图的单元最短路径问题,即某个源点到达图中其余顶点的最短路径,其核心思想是每次从剩余未归入路径的顶点中找到一个到达当前路径距离最短的顶点,将其归入路径中,共执行n-1次。该算法需要三个辅助数组,s[ ]数组用来标记各个顶点有没有被归入当前路径中,dist[ ]数组用于表示当前源点到达各个顶点的最短路径长度,path[ ]数组用来存储该顶点在最短路径中的前驱结点。 #include<stdio.h> //迪杰斯特拉算法,求带权图中某个源点到到达其余各个顶点的最短路劲,其需要三个辅助数组,s[i]=1表示 //该顶点已经求得最短路径,0表示未求得;dist[]数组用来存储当前源点到达各个顶点的最短路径;path[] //数组存储源点到达该顶点的最短路径中其前驱结点 void Dijkstra(Mgraph G,int v,int dist[],int path[]) { int[MAXSIZE]; int i,j,min,u; //初始化各个数组 for(i = 0;i < G.vexnum;++i){ dist[i] = G.edges[v][i]; //dist[]初始时存储各个顶点到达源点的带权路径长度 s[i] = 0; //一开始各个顶点均未规划进入路径 if(dist[i] < 65535) path[i] = v; //如果顶点与源点有弧

water_堆优化+类dijkstra思想

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-27 22:09:03
第一眼,每个格子取决于和他相临的格子,直接枚举O(nm),这么水?!! 第二眼,没那么简单,要找到类似水池的东西,这个池子的边界高度的min才是此格子的高度。为了保证时间复杂度,希望能尽量找到一个格子能被覆盖的最大池子,这样能尽可能地覆盖到别的格子,能近似到一次遍历就出来了,基本O(nm)。 然后。。。发现根本不能找到最大的池子,我的暴力是一层层把小的抬高,O(n^2m^2),QAQ 考虑一个模拟,一格水掉到一个比较高的地上,一定会流到它能流到的最低的地方,这个最低的地方是一个坑,它一定是在类中心位置,也就是说水在一个边界向内流,我们可以不短缩小边界来更新出每个点+积水的高度。维护一个堆,取出最小的,因为一个水池的最终高度是边界高度的最小值。 懵懂。。。 1 #include<bits/stdc++.h> 2 #define MAXN 310 3 using namespace std; 4 inline int maxn(int a,int b){return a>b?a:b; } 5 inline int minn(int a,int b){return a<b?a:b; } 6 int n,m; 7 int ht[MAXN][MAXN]; 8 int zui[MAXN][MAXN]; 9 int wtr[MAXN][MAXN]; 10 struct node{ 11 int

POJ 1847(dijkstra坑爹题意)

橙三吉。 提交于 2019-11-27 17:03:17
Tram Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21783 Accepted: 8107 Description Tram network in Zagreb consists of a number of intersections and rails connecting some of them. In every intersection there is a switch pointing to the one of the rails going out of the intersection. When the tram enters the intersection it can leave only in the direction the switch is pointing. If the driver wants to go some other way, he/she has to manually change the switch. When a driver has do drive from intersection A to the intersection B he/she tries to choose the route that will minimize

POJ 1062(dijkstra+思维)

别来无恙 提交于 2019-11-27 17:01:37
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 60913 Accepted: 18405 Description 年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。另外他要告诉你的是,在这个部落里,等级观念十分森严。地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。因此你需要在考虑所有的情况以后给他提供一个最好的方案。 为了方便起见

POJ 2502(dijkstra+建图)

末鹿安然 提交于 2019-11-27 17:00:16
题目:输入x1,y1,x2,y2表示起点和终点的坐标。接下来输入地铁线 0 0 10000 1000 0 200 5000 200 7000 200 -1 -1 2000 600 5000 600 10000 600 -1 -1 起点(0,0),终点(10000,1000)第一条地铁线是(0,200)--(5000,200)--(7000,200)第二条是--------------------------(自己看)文件结束输入哦主角是可以从任意点走到任意点的,速度是10000/60,坐地铁的话不用等,速度是40000/60;地铁是可以在中间站下车的例如(0,200)这样的点。双向的,而且两个相邻中间站的中间站之间是直线问:从起点到终点的最快时间思路:建图很重要,主角可以从起点走到终点,也可以从地铁的中间站上车。 要注意,假如有个地铁线路,我或许从第二个站台下车,直接走到第四个站台更快,所以当存地铁线路时候,当前站台(如果不是第一个)和上一个站台建立速度为40000/60的地铁线,而和上上个站台或许更上个站台建立速度为10000/60的路。注意double #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <string> #include <map>

POJ 3159(差分约束+dijkstra)

自闭症网瘾萝莉.ら 提交于 2019-11-27 16:57:53
题目:输入n,m个关系。接下来m行每行A,B,C。表示B比A多出来的糖果不超过C个。 问:n号人最多比1号人多几个糖果 思路:差分约束关系,B-A<C可以看作由A做一条有向边到B,权值为C。问题变成了1到N的最短路 这题貌似只能用邻接表+优先队列,反正我平常都这么写的。这题同样也卡scanf #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <string> #include <map> #include <iomanip> #include <algorithm> #include <queue> #include <stack> #include <set> #include <vector> //const int maxn = 1e5+5; #define ll long long ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} ll lcm(ll a,ll b){return a/gcd(a,b)*b;} //const int inf = 0x6fffffff; #define MAX INT_MAX #define FOR(i,a,b) for( int i = a;i <= b;++i) #define bug

POJ 1511(dijkstra)

爱⌒轻易说出口 提交于 2019-11-27 16:55:49
poj1511 题意:有向图, 求:1到n的最短路和n到1的最短路。 思路:裸体,这题卡scanf注意下。和POJ3268差不多 #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <string> #include <map> #include <iomanip> #include <algorithm> #include <queue> #include <stack> #include <set> #include <vector> //const int maxn = 1e5+5; #define ll long long ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} ll lcm(ll a,ll b){return a/gcd(a,b)*b;} //const int inf = 0x6fffffff; #define MAX INT_MAX #define FOR(i,a,b) for( int i = a;i <= b;++i) #define bug cout<<"--------------"<<endl using namespace std; ll ver1[1010000],edge1[1010000]

Dijkstra for longest path in a DAG

倖福魔咒の 提交于 2019-11-27 16:11:58
问题 I am trying to find out if it is possible to use Dijkstra's algorithm to find the longest path in a directed acyclic path. I know that it is not possible to find the longest path with Dijkstra in a general graph, because of negative cost cycles. But it should work in a DAG, I think. Through Google I found a lot of conflicting sources. Some say it works in a dag and some say it does not work, but I didn't find a proof or a counter example. Can someone point me to a proof or a counter example?

最短路径算法--A*算法实现

岁酱吖の 提交于 2019-11-27 15:48:54
最短路径算法--A*算法实现 定义 算法介绍 算法原理 算法实现 实验对比 定义 A*算法是最短路径算法中的一种启发式算法。 去看 原文 算法介绍 A*算法是一个目标导向的算法。为什么这么说了,这是因为A*在Dijkstra算法的基础上利用了一个启发式函数,该函数被定义为某个节点到目标点的距离(欧式距离、曼哈顿距离等),可以表示为h(u,t),其中u是任意一个节点,t是目标点,所以A*算法的每个节点的优先值为f(u)=dist(s,u)+h(u,t)。这个启发式函数的作用就是能够让那些靠近目标点的节点先被访问到,从而驱动搜索方向朝目标点方向推进。就是这个小小的改进就可以让算法的效率有一定提升。 它的搜索空间是这样的: 算法原理 A*算法的基本步骤和Dijkstra算法是一样的,也需要一个优先队列,唯一不一样的便是这个启发值,当你把启发值设为0时,也就是Dijkstra算法。 算法实现 伪代码 这是松弛函数,红色框中便是加入了欧式距离启发值。 实验对比 测试部分比较了单向Dijkstra算法、双向Dijkstra算法以及A*算法的效率。随机从武汉路网中取了100对OD,分别记录每对OD最短路径计算的运行时间以及扩展节点数量。 从图中,我们可以很清楚的看到A*的运行时间还是要优于Dijkstra算法的,搜索空间A*算法也是比Dijkstra算法要小,但是A