
最短路
文章平均质量分 65
最短路
_lifehappy_
这个作者很懒,什么都没留下…
展开
-
CF196E Opening Portals
CF196E Opening Portals给定一个有nnn个节点,mmm条边的无向联通图,有kkk个点有portalsportalsportals,当经过了某个点,如果这个点有portalportalportal,它就会永久开启,对于任意两个开启的portalportalportal,我们可以不需要花时间穿行,问开启所有的portalportalportal需要多少时间。可以考虑这是一个1−>Sv1->S_v1−>Sv,SvS_vSv是另kkk个portalsportalspo原创 2021-03-09 20:35:57 · 313 阅读 · 0 评论 -
Legacy(线段树优化建边跑Dijkstra)
Legacy线段树优化建边,开两颗线段树:对于线段树1,自顶向下连边。对于线段树2,自底向上连边。然后对于op1我们直接连边即可。对于op2(u -> [l, r] cost = w),这个操作在线段树1上完成即可。对于op3([l, r] -> v cost = w),这个操作在线段树2上完成即可。最后跑一遍Dijkstra最短路即可。/* Author : lifehappy*/#include <bits/stdc++.h>#define mid (l原创 2020-11-05 20:52:02 · 406 阅读 · 0 评论 -
HDU 6071 Lazy Running(同余最短路的应用)
Lazy Running思路还是利用同余的思想,假设存在一条长度为kkk的路,那么也一定存在一条k+basek + basek+base的路base=2∗min(d1,d2)base = 2 * min(d1, d2)base=2∗min(d1,d2)。dis[i][j]=xdis[i][j] = xdis[i][j]=x表示的是,从2−>i2 -> i2−>i点x≡j(modbase)x \equiv j \pmod {base}x≡j(modbase)的满足条件的最小的xxx,所原创 2020-07-20 10:07:54 · 311 阅读 · 0 评论 -
P2662 牛场围栏(同余最短路)
P2662 牛场围栏思路假设我们已经知道同余最短路是什么了,这里就不再过多赘述。我们要尽可能地得到更多地课建成地边,那么我们必然要选一个basebasebase相对小的,因此我们可以对所有的棍子排个序,然后取a[1]−ma[1] - ma[1]−m作为我们选取的basebasebase。接下来就是考虑建边了,参考这篇博客,我们对所有的可能的边都建立一条与basebasebase同余的边,即for(int i = 1; i < n; i++) for(int j = 0; j <原创 2020-07-19 17:42:33 · 459 阅读 · 1 评论 -
同余最短路(P3403 跳楼机)
同余最短路前置给定m个数,这m个数可以重复取,问最大的这m个数不能拼成的数,或者给定一定范围,范围里有多少个数是这m个数可以拼成的,对于这种问题我们可以考虑同余最短路的算法。P3403 跳楼机同余最短路介绍首先我们要选择一个basebasebase作为基底,之后所有的距离就可以描述成a∗base+ba * base + ba∗base+b。在这题中我们选定xxx作为base。dis[i]=valuedis[i] = valuedis[i]=value有如下含义:value≡i(modx)val原创 2020-07-19 14:54:25 · 395 阅读 · 0 评论 -
模板:Prime最小生成树堆优化 + Dijkstra单源最短路堆优化
Dijkstra 单源最短路堆优化#include<bits/stdc++.h>using namespace std;typedef pair<int, int> PII;const int N = 2e5 + 10;int head[N], to[N], value[N], nex[N], cnt = 1;int n, m, rt, st, dis[N], ...原创 2020-03-20 17:08:16 · 373 阅读 · 0 评论 -
DijKstra算法普通+堆优化链式向前星
朴素版本#include<bits/stdc++.h>using namespace std;const int maxn = 10010;const int inf = 0x3f3f3f3f;int a[maxn][maxn],dis[maxn],visit[maxn],n,m,s,t;void init() { for(int i = 1; i <= n; i+...原创 2020-02-19 12:13:31 · 418 阅读 · 0 评论 -
SPFA算法
这一算法的核心思想是通过两边之和大于第三边不断逼近两个点的距离,最后得到最短距离。再通过不断的入列出列,最后使距离不能再小,得到最小距离。邻接矩阵#include<bits/stdc++.h>using namespace std;const int inf = 0x3f3f3f3f;const int maxn = 210;int q[maxn],dis[maxn],...原创 2020-02-18 16:38:09 · 304 阅读 · 1 评论 -
最短路弗洛伊德(Floyd)算法加保存路径
弗洛伊德算法大致有点像dp的推导dp[i][j] = min(dp[i][k] + dp[k][j], dp[i][j]),其中 i 是起始点,j 是终止点。k是它们经过的中途点。通过这个公式不断地更新dp[i][j],得到最短路径长。我们先定义两个矩阵,minpath[i][j],表示的是从 i 到 j 当前得到的最短路,road[i][j] = k.表示的是从 i 到 j 点要经过的...原创 2020-02-17 20:49:07 · 1077 阅读 · 0 评论 -
最小生成树Prime算法
洛谷p1546链接Prime算法的核心也是贪心,但是不同的就是,它是一直维护一颗树,直到变成一颗最小生成树,#include<bits/stdc++.h>using namespace std;const int maxn = 110;const int inf = 0x3f3f3f3f;int maze[maxn][maxn], dis[maxn], n;//maze...原创 2020-02-17 19:40:19 · 500 阅读 · 0 评论 -
最小生成树KrusKal算法(并查集)
洛谷p1111链接克鲁斯卡尔算法的思路就是由森林变成树的过程,其中最主要的就是贪心和并查集的应用。我们知道链接n个点需要n-1条边,这就满足的最后生成的是一颗树,而不是一个环。在这n-1条边的选择上我们又要尽可能的让边的权重小,于是我们不难想到先对边的权重进行升序排序。然后再去判断这条边的两个点在不在一颗树上,如果不在就连接这两颗树。 如果在就舍弃这条边继续找下一条边,当联通的边等于n-1时,...原创 2020-02-17 18:26:24 · 353 阅读 · 0 评论