dijkstra

[luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)

烈酒焚心 提交于 2020-03-06 00:56:03
[luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kruskal重构树。我们把边按海拔高度从大到小排序,然后建立一棵Kruskal重构树。 树上维护什么呢?我们除了在点上记录高度外,把最底层的点1~n的权值设为点i到1的最短路径长度,然后维护子树最小值。我们在Kruskal重构树上从v开始树上倍增,找到深度最浅的高度>=水位线的点x,这样x子树中的点都是开车可以到达的,而最小步行距离就是x子树中的点对应到原图上后,到点1的距离。 代码 //https://www.luogu.org/problem/P4768 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> #define maxn 200000 #define maxm 400000 #define maxlogn 23 using namespace std; typedef long long ll; int t; int n,m,q,k,s; struct graph { struct edge { int from;

dijkstra ZQUOJ 21463&&POJ 3463 Sightseeing

馋奶兔 提交于 2020-03-05 04:33:02
题目:Sightseeing 来源:ZQUOJ 21463&&POJ 3463 Description Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the bus moves from one city S to another city F . On this way, the tourists in the bus can see the sights alongside the route travelled. Moreover, the bus makes a number of stops (zero or more) at some beautiful cities, where the tourists get out to see the local sights. Different groups of tourists may have different preferences for the sights they want to see, and thus for the route to be taken from S to F . Therefore, Your Personal Holiday wants to

hdu 2066 ( 最短路) Floyd & Dijkstra & Spfa

风格不统一 提交于 2020-03-04 07:32:32
http://acm.hdu.edu.cn/showproblem.php?pid=2066 今天复习了一下最短路和最小生成树,发现居然闹了个大笑话-----我居然一直写的是Floyd,但我自己一直以为这是Dijkstra---我居然一直把两个算法 记的是混的,还居然一直没有被别人发现,真是个大乌龙 好了,看看这道题,赤裸裸的最短路水题,首先来个Floyd的,把城市看成点,将连通的的点赋值为给定的时间,未连通的赋值为很大,这是个无向的关系 然后就是三个循环,以一个点为媒介,把每个点遍历一遍,比较找出点连通的最小值就行,稍微优化一点点就不会超时了 code 1 #include<cstdio> 2 #include<algorithm> 3 #define inf 1000000005 4 using namespace std; 5 int mp[1001][1001],q[1001]; 6 void jjc() 7 { 8 int i,j; 9 for (i=1;i<=1000;i++){ 10 for (j=1;j<=1000;j++){ 11 if (i==j) mp[i][j]=0; 12 else mp[i][j]=inf; 13 } 14 } 15 } 16 int min(int x,int y){ 17 if (x<y) return x; 18 else

初探Floyd和Dijkstra

混江龙づ霸主 提交于 2020-03-03 19:08:22
Floyd: 问题:Floyd算法求解下图各个顶点的最短距离 解析: 从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,算法假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,算法检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离 核心代码: for(u = 0; u < G.vexnum; ++ u) for(v = 0; v < G.vexnum; ++ v) for(w = 0; w < G.vexnum; ++ w) if(D[v][u] + D[u][w] < D[v][w])// 从v经u到w的一条路径更短 D[v][w] = D[v][u] + D[u][w]; View Code Dijkstra: 问题:用Dijkstra算法求由顶点a到顶点b的最短路径 解析: ① 不断运行广度优先算法找可见点,计算可见点到源点的距离长度 ② 从当前已知的路径中选择长度最短的将其顶点加入S作为确定找到的最短路径的顶点。 a b c d e f g h A 0 1 2 ∞ ∞ ∞ ∞

最短路径算法 : Dijkstra 和Floyd

爱⌒轻易说出口 提交于 2020-03-03 07:12:00
思想:Dijkstra是求单源最短路径,Floyd算法是用于求多源最短路径,算出来的是所有的节点到其余各节点之间的最短距离。 Dijkstra算法 先遍历一下还没有在最短路中的点,选出一个距离 已经在最短路集合中的点 距离最近的点(遍历与 最短路包含的点 相连的节点),并把它加入到最短路中,并且更新所有点的最短路,直到所有的点都加入到最短路中。 图解参考: https://www.cnblogs.com/Glacier-elk/p/9438077.html 操作步骤 (1) 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为"起点s到该顶点的距离"[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。 (2) 从U中选出"距离最短的顶点k",并将顶点k加入到S中;同时,从U中移除顶点k。 (3) 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。 (4) 重复步骤(2)和(3),直到遍历完所有顶点。 例子 #leetcode1368困难 class Solution: def minCost(self, grid: List[List[int]]) -> int: #0302 30min ''

POJ 3463 堆优化 dijkstra

六眼飞鱼酱① 提交于 2020-02-28 15:35:09
大致题意 图中有 N 座城市,M 条长为 L 的有向路径,求城市 S 到城市 F 间最短路和比最短路长 1 个单位的路径的数量和,该数字最多达到 10 9 。2 ≤ N ≤ 1,000, 1 ≤ M ≤ 10, 000, 1 ≤ L ≤ 1,000 基本思路是分别求图中最短路和次短路的数量,然后判断最短路与次短路长度是否差值为 1。 通过修改 dijkstra 算法,不断更新最短路和次短路,在O(MlogN) 内求解。有点类似 POJ 3255 求解次短路的长度的做法,这里需要修改一下。统计路径数量,可以 dfs 路径还原做,但这里复杂度感人。那么可以在 dijkstra 算法中一边更新路径值,一边统计路径数。 统计路径数量,对于更新的结点,到该节点的路径数为前驱结点记录的路径数;对于不能更新,但与当前保存的值相等的情况,到该节点的路径数加上前驱结点的路径数。 对于优先队列的优化,参照白书 POJ 3255 的做法 link ,对于当前出队的值,若果大于当前保存的次短路的值,则表示该节点已经被更新过,不予处理。 if ( cost > dist [ v ] [ 1 ] ) continue ; 然后开始WA得着迷… dijkstra 的基础是图中没有负边, 找到最短路已被确定的顶点,从它出发更新相邻顶点的最短距离,此后不需要再关心该节点 ,路径数量统计也不会重复,次短路同理。

PAT Advanced 1030 Travel Plan (30) [Dijkstra算法 + DFS,最短路径,边权]

試著忘記壹切 提交于 2020-02-27 16:25:24
题目 A traveler’s map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help a traveler to decide the shortest path between his/her starting city and the destination. If such a shortest path is not unique, you are supposed to output the one with the minimum cost, which is guaranteed to be unique. Input Specification: Each input file contains one test case. Each case starts with a line containing 4 positive integers N, M, S, and D, where N (<=500) is the number of cities (and hence the cities are numbered from

priority queue implementation explanation

末鹿安然 提交于 2020-02-25 02:13:10
问题 I was reading Dijkstra's algorithm from the book competitive programming 1.In the implementation program they have written something like this : #define pair<int,int> ii; priority_queue< ii,vector<ii>,greater<ii> > pq ; If we are taking an integer s as a source,the implementation shows to push pair (cost,source) like this (nodes are numbered from 1 to n) : pq.push(ii(0,s)) ; My question is we are pushing a pair of cost and node in the priority queue. But what the two other parameters (namely

Dijkstra求最短路径

删除回忆录丶 提交于 2020-02-24 12:51:59
Dijkstra求最短路径 问题: 给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。 朴素 Dijkstra算法: Example 输入格式 第一行包含整数n和m。 接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。 输出格式 输出一个整数,表示1号点到n号点的最短距离。 如果路径不存在,则输出-1。 数据范围 1≤n≤5001≤n≤500, 1≤m≤1051≤m≤105, 图中涉及边长均不超过10000。 输入样例: 3 3 1 2 2 2 3 1 1 3 4 输出样例: 3 #include <cstring> #include <iostream> #include <algorithm> using namespace std; //使用邻接矩阵来写 const int N = 510; int n, m; int g[N][N]; int dist[N];//dist[N]狄杰斯特拉的距离,表示从1号点到其他点的最短距离是多少。 bool st[N];//st[]每个点最短路是否确定 int dijkstra() { memset(dist, 0x3f, sizeof dist);// 初始化 dist[1] = 0;//1

算法复习:最短路Dijkstra - Ford - Floyd

三世轮回 提交于 2020-02-23 11:22:48
Dijkstra算法适用范围是单源最短路,有向图或者无向图,不能处理负权值 Floyd算法适用多源最短路,有向图或者无向图,可以处理负权值但是不能处理负权回路 Ford 算法 多源最短路, 可以处理负权值,能检测负权回路 Leetcode 743. 网络延迟时间 先用Dijkstra算法解,输入是vector要转存一下,另外找的是最后一个传播到的节点所用时间 #define max 999999 #define CLR(donser,value) memset(donser,value,sizeof(donser)) class Solution { public: int networkDelayTime(vector<vector<int>>& times, int N, int K) { int dis[N+1],map[N+1][N+1]; CLR(dis,max); bool visit[N+1]; CLR (visit,false); for(int i=1;i<=N;i++)//先初始化map for(int j=1;j<=N;j++) map[i][j]=max; for(int i=0;i<times.size();i++)//把边转存到map map[times[i][0]][times[i][1]]=times[i][2]; for(int i=1;i<=N