最短路问题
文章平均质量分 62
AC__dream
道阻且长,行则将至;行而不辍,未来可期!
展开
-
L3-018 森森美图(计算几何+dijkstra)
关键是我们怎么求边权,首先可以想到我们肯定是先建立直线一边的边权,这里的边权只涉及到这部分内的点,如果这两个点不在一边,那么我们就不对两点设置边权,那么这样建好一边的图后跑一个最短路就可以计算出一侧的最短路径,然后再把图清空后处理另一边即可。,这与我们通常的逻辑思维是不一样的,我一般会习惯性地把纵轴看成x,横轴看成y,所以在这道题目上我首先就是要交换给定点的横纵坐标。题目给定了两个点,那么这两个点就会形成一条直线,这条直线就讲整个图分为了两个部分,让我们。分析:这道题目难度不大,但是坑比较多。原创 2023-03-15 22:35:36 · 357 阅读 · 0 评论 -
P3905 道路重建(dijkstra)
最短路原创 2023-03-02 20:54:27 · 62 阅读 · 0 评论 -
2021 RoboCom 世界机器人开发者大赛-本科组(决赛)7-4猛犸不上 Ban(最短路)
2021 RoboCom 世界机器人开发者大赛-本科组(决赛)7-4猛犸不上 Ban(最短路)原创 2022-08-07 20:32:52 · 284 阅读 · 0 评论 -
2022杭电多校五 C - Slipper (dijkstra+虚拟结点)
给定一棵根节点为1节点个数为n的树,每条边都有一个权值,假如u和v之间有一条权值为w的树,代表从u->v和从v->u的代价是w,接下来给定一个k和val,代表我可以选择花费val从第i层的任意一个节点跳至第i+k或者i-k的任意一个节点,前提是所要跳到的那一层是真实存在的,最后给我们一个起点和终点,问我们从起点到终点最小的代价是什么。......原创 2022-08-03 13:41:06 · 222 阅读 · 0 评论 -
(2022牛客多校三)J-Journey(dijkstra)
(2022牛客多校三)J-Journey(dijkstra)原创 2022-07-26 22:16:57 · 165 阅读 · 0 评论 -
2021 RoboCom 7-3 打怪升级 (dijkstra+floyd)
7-3 打怪升级原创 2022-07-09 22:38:57 · 339 阅读 · 0 评论 -
(HDU2066)一个人的旅行(dijkstra+多起点多终点)
题目链接:Problem - 2066分析:这是一个典型的多起点多终点的dijkstra问题, 思路就是新建一个超级源点(我设置的是10000),让这个源点到所有起点加一条权值为0的边,然后直接从源点开始跑dijkstra,求一下所有终点到远点的最小值即可。如果有对超级源点原理不明白的同学可以看这里:超级源点使用技巧_AC__dream的博客-CSDN博客_超级源点超级源点就是用于解决这种起点终点不唯一的情况,当然这道题也可以再建立一个超级源点,让其与所有终点连一条长度为0的边,然后直接求两原创 2022-05-16 14:41:23 · 363 阅读 · 0 评论 -
(L3-028)森森旅游(dijkstra+multiset用法)
题目链接:PTA | 程序设计类实验辅助教学平台分析:这道题目由于只能在途中的某个城市兑换旅游金,而且须将剩余现金全部、一次性兑换,剩下的旅途将完全使用旅游金支付,所以我们可以先分别求出1号点到任意其他点所需要的最少现金和从任意点到n号点所需要的最少旅游金,求出来这些我们就可以直接枚举每个点作为中间点寻求最佳兑换点。从1号点到所有任意其他点的最少现金比较好求,就是直接从1号点跑一边dijkstra即可,关键是如何求出来从任意点到n号点所需要的最少旅游金,其实这个也不难想,就是我们建反边再从n原创 2022-04-03 13:25:49 · 336 阅读 · 0 评论 -
(L3-011)直捣黄龙(dijkstra变形)
题目链接:PTA | 程序设计类实验辅助教学平台输入样例:10 12 PAT DBYDBY 100PTA 20PDS 90PMS 40TAP 50ATP 200LNN 80LAO 30LON 70PAT PTA 10PAT PMS 10PAT ATP 20PAT LNN 10LNN LAO 10LAO LON 10LON DBY 10PMS TAP 10TAP DBY 10DBY PDS 10PDS PTA 10DBY ATP 10输出样例:原创 2022-03-31 12:02:50 · 63 阅读 · 0 评论 -
(L2-001)紧急救援(dijkstra变形)
题目链接:PTA | 程序设计类实验辅助教学平台分析:这道题跟其他的dijkstra最短路题目略有不同,这道题目需要求最短路径的方案数,我在这个地方犯了一个错误,卡了挺长时间,一会我会重点说一下这个地方。因为我们要求最短路径的方案数,所以我们要定义一个f[i]记录到达i节点最短路径的条数,因为还需要统计救援队数量,所以我们还需要定义一个cnt[i]记录到达i节点的最多召集的救援队数量。接下来我说一下dijkstra更新过程:首先是比较d[j]与d[begin]+w[i](begin与i之间的原创 2022-03-30 16:35:23 · 407 阅读 · 0 评论 -
(L3-007)天梯地图(dijkstra+路径输出)
题目链接:PTA | 程序设计类实验辅助教学平台输入样例1:10 150 1 0 1 18 0 0 1 14 8 1 1 15 4 0 2 35 9 1 1 40 6 0 1 17 3 1 1 28 3 1 1 22 5 0 2 22 1 1 1 11 5 0 1 31 4 0 1 19 7 1 1 33 1 0 2 56 3 1 2 15 3输出样例1:Time = 6: 5 => 4 => 8 => 3Distance = 3原创 2022-03-23 19:55:32 · 571 阅读 · 0 评论 -
(L3-008)喊山(dijkstra)
题目链接:PTA | 程序设计类实验辅助教学平台输入样例:7 5 41 22 33 14 55 61 4 5 7输出样例:2640分析:题目中给出的两个山头之间可以听到可以等价成两个点之间有一条长度为1的无向边,给了m组关系,我们只需要把这张图建好,然后对于每个询问直接以该点为源点跑一次最短路就可以求得该点可以到达的距离最远的边,题目不算很难,分析就到这了,下面是代码:#include<cstdio>#include<iostream原创 2022-03-22 09:56:45 · 14 阅读 · 0 评论 -
(L3-005)垃圾箱分布(dijkstra)
题目链接:PTA | 程序设计类实验辅助教学平台输入样例1:4 3 11 51 2 21 4 21 G1 41 G2 32 3 22 G2 13 4 23 G3 24 G1 3G2 G1 1G3 G2 2输出样例1:G12.0 3.3输入样例2:2 1 2 101 G1 92 G1 20输出样例2:No Solution分析:这道题目考察的是最短路的知识,我们把垃圾箱看成是普通的点即可,只是把他们的编号设置在n+1~n+m,由原创 2022-03-21 22:28:21 · 503 阅读 · 0 评论 -
P1629 邮递员送信(最短路+反向建边)
题目链接:邮递员送信 - 洛谷这道题需要注意的一点是题目中所给的边是单向边,如果是双向边的话那么1到其他点所需的最短距离与从其他点回来的最短距离是相等的,就是我们只需要从1号点跑一个最短路,然后加上所有距离的二倍即可。我们求的是1号点到其他所有点的最短距离的和+所有其他点到1号点的最短距离和,我们把答案分成这两部分求,先求1号点到其他所有点的最短距离的和,这个比较简单,就是从1号点跑一个最短路求出1号点到其他点的最短路及,然后就把他们加起来即可,关键是求所有其他点到1号点的最短距离和,我们.原创 2022-02-26 19:21:44 · 110 阅读 · 0 评论 -
P1613 跑路(最短路+倍增)
题目链接:跑路 - 洛谷分析:看到每秒钟只可以跑2^k千米,我们就应该想到这道题目考察的是倍增的思想,我们令f[i][j][k]=0/1表示存在/不存在一条i到j存在一条距离为2^k的路线,如果i到j存在一条距离为2^k的路线,那么对应的i到j的时间d[i][j]就应该是1,由f[i][j][t-1]=f[j][k][t-1]=1就可推出f[i][k][t]=1,按照这个更新方式更新完所有的f数组我们就可以得知任意两点直接存在的最短时间,然后我们跑个floyd即可求得1到n的最短路(因为数据范围比较原创 2022-02-26 16:50:11 · 208 阅读 · 0 评论 -
(POJ - 1511)Invitation Cards(最短路+反向建边)
题目链接:1511 -- Invitation Cards简化版题意:T组样例,每组样例先给出点的个数n和边的个数m,然后给出m条边的信息a,b,c表示a到b有一条长为c的单向边,现在我们每次都需要从1号点跑到其他点然后再跑回来,问我们最少需要走的距离。这道题需要注意的一点是题目中所给的边是单向边,如果是双向边的话那么1到其他点所需的最短距离与从其他点回来的最短距离是相等的,就是我们只需要从1号点跑一个最短路,然后加上所有距离的二倍即可。我们求的是1号点到其他所有点的最短距离的和+所有其他点到1原创 2022-02-17 13:15:00 · 288 阅读 · 0 评论 -
(POJ - 1847)Tram(最短路)
题目链接:1847 -- Tram题意:有n个点,然后这些点和其他点有些路径,每个点是一个开关,开关只能有一个方向走一条路,而第一个数就是默认的开关指向,不用旋转。就是默认的指向实际上只需要旋转0次,而其他路径只需要旋转1次,无论是哪条,只需1次。求a到b最小的旋转次数这道题就是一个最短路的裸模板,但是他给的边的长度只有0和1,就是所给第一个点的距离是0,其他点的距离都是1,这个地方卡了我好久,我一开始以为当前点是第几个给出的距离就是几-1,其实只要不是第一个给出的,则距离都为1,这个地方需要注意一原创 2022-02-16 11:45:00 · 231 阅读 · 0 评论 -
Cow Contest(floyed关系的传递性)
题目:N(1 ≤N≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a certain constant skill rating that is unique among the competitors.The contest is conduct...原创 2022-01-16 13:25:49 · 376 阅读 · 1 评论 -
MPI Maelstrom
题目:BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distributed shared memory machine with a hierarchical communication subsystem. Valentine McKee's research advisor, Jack Swigert, has asked her to benchmark the new原创 2022-01-16 12:44:17 · 2 阅读 · 0 评论 -
(LightOJ - 1321)Sending Packets(数学期望+最短路)
题目链接:Sending Packets - LightOJ 1321 - Virtual Judge为了方便起见,我下面内容下标均从1开始题意:有n个路由器,我们现在要从1号路由器向n号路由器传送数据,两个路由器之间的边代表数据沿这条边传输数据成功的概率。问传输完sKB的数据所需的最小期望时间,传输数据遵循以下规则:(1)每次只能传输1KB的数据(2)每次成功传输数据后我们在2*k时间后都能收到信息(3)如果在传输当前数据2*k时间后我们没有收到信息,那我们就需要重新传输这条数据分原创 2021-10-27 09:36:49 · 140 阅读 · 0 评论 -
Air Conditioners
题目链接:https://codeforces.com/problemset/problem/1547/E这个题意比较容易理解,就是让我们求每个空格的最低温度,这道题目可以用最短路解决,我们可以让每两个相邻的点的距离为1,然后建立一个虚拟源点,把每个装有空调的格子与虚拟源点连一条边,权值为空调的温度,最后直接跑一个dijkstra就可以求得答案,下面是代码:#include<cstdio>#include<cstring>#include<algorithm>原创 2021-08-21 10:47:15 · 183 阅读 · 1 评论 -
POJ-3037(思维+bfs+spfa)
Bessie and the rest of Farmer John's cows are taking a trip this winter to go skiing. One day Bessie finds herself at the top left corner of an R (1 <= R <= 100) by C (1 <= C <= 100) grid of elevations E (-25 <= E <= 25). In order to join原创 2021-08-07 12:13:30 · 98 阅读 · 0 评论 -
HDU-6714(dijkstra)
小 A 是社团里的工具人,有一天他的朋友给了他一个n个点,m条边的正权连通无向图,要他计算所有点两两之间的最短路。作为一个工具人,小 A 熟练掌握着 floyd 算法,设 w[i][j]为原图中 (i,j)之间的权值最小的边的权值,若没有边则 w[i][j]=无穷大。特别地,若i=j,则w[i][j]=0。Floyd 的 C++ 实现如下:```c++for(int k=1;k<=p;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n...原创 2021-08-07 12:00:26 · 53 阅读 · 0 评论 -
spfa算法求负环兼最短路
在这之前我对spfa判负环一直有一定的误解,今天想借着这道题把一些容易出错的点说出来,也希望大家做这类题目时能少走一些弯路。题意:输入数据给出一个有个节点,条边的带权有向图。要求你写一个程序,判断这个有向图中是否存在负权回路。如果从一个点沿着某条路径出发,又回到了自己,而且所经过的边上的权和小于,就说这条路是一个负权回路。如果存在负权回路,只输出一行;如果不存在负权回路,再求出一个点到每个点的最短路的长度。约定:到的距离为,如果与这个点不连通,则输出NoPath。...原创 2021-08-06 22:27:41 · 366 阅读 · 0 评论 -
最短路反向建边问题
在今天的限时训练中遇到了一道有意思的最短路问题,现在来跟大家分享一下。题意:One cow from each ofNfarms (1 ≤N≤ 1000) conveniently numbered 1..Nis going to attend the big cow party to be held at farm #X(1 ≤X≤N). A total ofM(1 ≤M≤ 100,000) unidirectional (one-way roads connects p...原创 2021-08-06 21:45:21 · 176 阅读 · 0 评论 -
Frogger(最短路变形问题)
今天我来分享一个最短路变形的问题:湖中有n块石头,编号从1到n,有两只青蛙,Bob在1号石头上,Alice在2号石头上,Bob想去看望Alice,但由于水很脏,他想避免游泳,于是跳着去找她。但是Alice的石头超出了他的跳跃范围。因此,Bob使用其他石头作为中间站,通过一系列的小跳跃到达她。两块石头之间的青蛙距离被定义为两块石头之间所有可能路径上的最小必要跳跃距离,某条路径的必要跳跃距离即这条路径中单次跳跃的最远跳跃距离。你的工作是计算Alice和Bob石头之间的青蛙距离。Input多实例输入原创 2021-08-06 11:10:03 · 438 阅读 · 0 评论 -
floyd算法求解多源最短路
在之前的文章中我介绍了dijkstra算法和spfa算法,这两种算法都是用来求最短路的,只是他们都只能用来求单源最短路,而我今天想要介绍的算法是floyd算法,这个算法是用来求多源最短路的。算法思想比较简单,就是:对于每一个顶点对(u,v),我们都用1~n中的所有点去更新他们之间的最短距离void floyd(){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i]原创 2021-08-04 22:27:37 · 267 阅读 · 1 评论 -
带有限制条件的最短路问题
我们一般遇到的最短路问题往往都带有一定的限制条件,今天我来分享一道带有限制条件的最短路问题。题目大意:年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他原创 2021-08-03 22:49:39 · 561 阅读 · 0 评论 -
最短路多起点多终点(超级源点)
我们先来回忆一下spfa判负环的思想:就是先把所有的点入队列,然后用一个一个点去枚举边去松弛点与点之间的距离,顺便记录一下被松弛点的最短路径所经过的边数,如果发现一个点的最短路径边数大于等于n(n为点数),那就说明图中存在负环。那有的同学可能就会有疑问了,为什么一开始要把所有的点都加入队列呢?那是因为图不一定是联通的,也就是说你一开始所选定的那个点可能根本就到不了负环,那我们一定要把所有点都加入队列吗?其实也不完全是,我们只要保证图是联通的不就好了吗?于是我们就可以建立一个虚拟源点,然后用这个点原创 2021-08-03 22:31:58 · 1251 阅读 · 0 评论 -
spfa算法求最短路
spfa算法本质上就是对bellman_ford算法的优化。我们先来回想一下bellman_ford算法的思想,就是每次利用每条边去尝试更新各店与源点之间的距离,无疑这样的复杂度是比较高的,那我们又该怎样进行优化呢?先思考一个问题,假如在上一次的松弛过程中i号节点距离源点的距离未被得到更新,那我们还有没有用与i号节点相连的边去更新其他节点的必要呢,肯定是没必要的,那我们只要把之前被更新过的点存起来,用这些点去更新其他点到源点的距离的话不就实现了对bellman_ford算法的优化了么?核心代码:原创 2021-08-01 21:04:03 · 223 阅读 · 0 评论 -
bellman_ford算法求最短路问题
先简单介绍一下算法的思想:与dijkstra算法不同的是,bellman_ford算法是利用边来更新两点之间的距离每次遍历所有边,看是否能够松弛,即更新源点到其他点的最小值。最多遍历n-1次,即可得到单源最短路。(遍历k次求出的是从源点经过不超过k条边走到任一点的最短距离)算法实现起来比较简单,下面直接上代码://解释:dist[i]代表i号点距离源点的最短距离//pre[i]用于存储i号点的前驱节点//temp[]用于存储上一次的dist值,防止更新下一次dist数组时用成本次的di原创 2021-08-01 20:34:43 · 246 阅读 · 0 评论 -
dijkstra求最短路问题
在图中,从一个点到另一个点的路径可能不止一条,每条路径的长度也不一定相同,最短路就是两点之间可达路径上各边的权值总和最小的路径上各边的权值和。对于最短路问题常常有两种情况,一种是单源最短路问题,另一种是多源最短路问题,单源最短路问题就是求从一个顶点出发到其他各顶点之间的最短路径问题,而多源最短路问题是求每对顶点之间的最短路径。今天要说的dijkstra算法就是典型的求单源最短路问题:算法的基本思想:先选定一个顶点,我们称之为源点,然后用与源点相连的边去更新其他点到源点的距离,然后找离这个源点原创 2021-08-01 20:10:39 · 2158 阅读 · 2 评论