随笔分类 -  图论 - Dijkstra

摘要:题目大意:给定一张$N$个点的图,构成了$M$个团,每个团内的边权均相等,求图上有多少个点满足到$1$号节点和$N$号节点的最大值最小。 题解: 本题的核心是如何优化连边,考虑对于每一个团增加一个虚拟节点,并让每个节点到虚拟节点连一条边权为$t_i$的有向边,虚拟节点到团中每一个点连一条边权为$0$ 阅读全文
posted @ 2019-11-03 00:23 shellpicker 阅读(205) 评论(0) 推荐(0)
摘要:题目大意:初始给定 N 个点,支持三种操作:两点之间连边;一个点与一个连续区间编号的点之间连边;一个连续区间内的点和一个点连边,求执行 N 次操作之后的单源最短路。 题解:学会了线段树优化建图。 发现若暴力进行连边,时间和空间都会被卡到 $O(n^2)$,直接起飞。 发现连边的点的编号是连续的,结合 阅读全文
posted @ 2019-09-16 18:32 shellpicker 阅读(174) 评论(0) 推荐(0)
摘要:题目大意:给定 N 个点,M 条边的无向图,在其中选定 P 个点,每个点可能被选多次,求图中的一个点到选定的 P 个点的距离的值最小是多少。 题解:由于数据范围的限制,直接 Floyd 会超时,因此对每个点做一次堆优化的 dij,统计答案贡献后更新答案即可。 代码如下 cpp include def 阅读全文
posted @ 2019-01-12 17:14 shellpicker 阅读(230) 评论(0) 推荐(0)
摘要:题目大意:给定一个 N 个点,M 条边的无向图,求从 1 号节点到 N 号节点的路径中,满足路径长度不大于 B 的情况下,经过顶点的点权的最大值最小是多少。 题解:最大值最小问题一般采用二分答案。这道题二分经过的点权,每次用二分出来的值跑最短路,在 dij 的过程中保证扩展的节点都是点权小于 mid 阅读全文
posted @ 2019-01-07 10:43 shellpicker 阅读(184) 评论(0) 推荐(0)
摘要:题目大意:定义一个无向图的最短路径生成树如下:在该无向图的生成树中,任意一个节点到根节点的距离均等于根节点到该节点的最短路。求有多少种最短路径生成树。 题解:首先跑一遍 dij 求出从根节点到每个节点的最短路,再跑 prim,模拟该生成树生成的过程,即:维护最短路径生成树集合,对于每个新加入生成树集 阅读全文
posted @ 2018-12-03 14:20 shellpicker 阅读(256) 评论(0) 推荐(0)
摘要:题目大意:给定一个 N 个点,M 条边的无向无权图,求从 1 号点出发到其他每个点最短路的条数。 题解:在跑 dij 时顺便维护 cnt[ ] 数组,用来记录到每个点的最短路条数。 代码如下 cpp include using namespace std; typedef pair P; const 阅读全文
posted @ 2018-11-19 11:08 shellpicker 阅读(153) 评论(0) 推荐(0)
摘要:题目大意:给定 N 个点 M 条边的无向简单联通图,留下最多 K 条边,求剩下的点里面从 1 号顶点到其余各点最短路大小等于原先最短路大小的点最多怎么构造。 题解:我们可以在第一次跑 dij 时直接采用贪心策略,即:若当前答案集合的大小小于 K 且优先队列非空,则继续优先队列BFS,每次把一条边加入 阅读全文
posted @ 2018-11-13 14:42 shellpicker 阅读(164) 评论(0) 推荐(0)
摘要:题目大意:给定一个 N 个点,M 条边(存在反向边)的有向图,点有点权,求一条从 1 到 N 的路径上,任意选出两个点 p,q (p 在前,q在后),两点点权的差值最大。 根据最短路的 dp 思想,可以先对原图进行一次 dij ,求出从源点出发,到下标为 X 的点的路径中,最小的点权;再对反图进行一 阅读全文
posted @ 2018-11-03 21:45 shellpicker 阅读(273) 评论(0) 推荐(0)
摘要:题目大意:给定一个 N 个顶点,M 条边的无向图,求一条从 1 号节点到 N 号节点之间的路径,使得第 K+1 大的边权最小,若 1 与 N 不连通,输出 1。 最小化最大值一类的问题,采用二分答案即可,每次跑一遍 dij ,若边权大于二分的值,那么等效边权为1,否则边权为0,最后判断从 1 到 N 阅读全文
posted @ 2018-11-03 20:44 shellpicker 阅读(169) 评论(0) 推荐(0)
摘要:题目大意:给定 N 个点,M 条边的有向图,边有边权,求从 1 号顶点到 N 号顶点的最短乘积路径。(经过的路径乘积最小)结果对9987取模。 乘积会爆 long long ,同时由于 dij 算法的性质,又不能在 bfs 的过程中对答案取模。 同时,根据对数的性质有 $log(x)+log(y)= 阅读全文
posted @ 2018-11-03 19:33 shellpicker 阅读(467) 评论(0) 推荐(0)
摘要:引理:当一个状态对应的节点第K次从堆中取出时,该状态对应的当前代价是从起点到该点的第K优解。 代码如下 阅读全文
posted @ 2018-10-19 00:11 shellpicker 阅读(220) 评论(0) 推荐(0)
摘要:Dij的核心思想:全局最小值不会被其他节点更新,因此得到最小值后只需要扩展一次即可。 概念:扩展、出队 注意:vis[ ]数组表示的是每个节点是否扩展过,因此开始时vis[st]不置1。 时间复杂度$O(m*log(n))$ 代码如下: #include <bits/stdc++.h> using 阅读全文
posted @ 2018-10-18 15:10 shellpicker 阅读(292) 评论(0) 推荐(0)