图论
文章平均质量分 56
Brokenrivers
这个作者很懒,什么都没留下…
展开
-
[NOIP2010 提高组] 关押罪犯 二分答案/二分图染色
因为要求所有冲突值最大的要最小,而且答案具有单调性,最大数值大了容易分配,小了不容易分配。容易想到二分枚举答案。然后就是如何判断这个答案是否合法。当前答案为mid,那么比mid大的冲突就不能发生,又因为有两个监狱,每个人必定在其中一个,那么比当前枚举的答案大的边(两个人的冲突值)构成一个二分图,也就是说有冲突(边)的两个犯人在相对的监狱,并且同一个监狱没有冲突则符合要求。所以想到用二分图染色判断比mid大的边构成的图是否构成二分,如果是则这个答案合法。...原创 2022-08-09 07:49:21 · 144 阅读 · 0 评论 -
最近公共祖先LCA 倍增法
也就是二进制的形式,基于此,对于线性的过程,则可以通过2^x的跳跃实现log级别的复杂度。最暴力的LCA做法就是手动将两个节调整到同一高度,然后同时向上跳直到取到最近的公共祖先。倍增基于一个常识,任何一个数都能表示为2的幂之和的形式如。之后的跳转就只需通过从这个表中取值就行了。之前学习了Tanjan求LCA的解法,通过倍增预处理一个跳转表。...原创 2022-08-05 20:37:36 · 268 阅读 · 0 评论 -
P2700 逐个击破 并查集/生成树
所以可以用并查集,每个联通块的祖先节点为一个被占领的城市。然后重新建图,删去最少价值的边也就意味着建最大价值的图,所以对边从大到小排序,然后并查集判断如果两个节点的祖先是否为被占领的城市。也就是让k个节点互不连通,很容易知道要产生这种情况,就必须将原图划分为k个互相独立的联通块,且每个联通块有且仅有一个k之一的节点。...原创 2022-08-02 21:55:42 · 184 阅读 · 0 评论 -
【模板】割点(割边)Tarjan
第一点很好实现,只需要判断一个节点由两个子树即可。麻烦在第二点,也就是判断一个非叶节点的子节点没有超过根节点的回边,什么意思?也就是1->2->3->4。这条路径,以2为父节点,子节点3没有回到超过2的节点的回边。而这个可以用Tarjan算法判断,定义一个记录dfs顺序的。其实跟强连通分量的Tarjan不太一样,但是基本思路还是差不多的。的时候则断开这个父节点,其他节点仍然可以由他的子节点通过所以。当子节点v最早可以回溯到超过父节点u的时候,也就是。数组,和一个记录最早能回到的编号的数组。.........原创 2022-07-28 23:01:13 · 541 阅读 · 0 评论 -
最近公共祖先(LCA)Tarjan
我们先会来到2,然后到3,3无子节点,搜索结束,开始回溯,回溯的第一个节点就是他本身3,此时有询问LCA(3,4)于是我们查看4,发现4还没有遍历到,跳过这个询问.之后程序从3回溯到2,没有关于2的询问而且2也没有其他分支可以走,2继续回溯到1也没有1的询问但是1有一个分支没有走,dfs从1搜索到4,4无子节点,搜索结束,开始回溯,4首先从4开始回溯,有关于4的询问LCA(3,4),判断3是否回溯过,答案是已经回溯了3。由并查集find实现,发现3的根节点是1,所以LCA(3,4)就是1....原创 2022-07-28 16:09:59 · 275 阅读 · 0 评论 -
P3387 【模板】缩点 Tarjan强连通分量/树上dp
就是将有向有环图中的网或者环结构合并看作一个点,使原图称为DAG(有向无环图)以便对图进行操作,如求最长路最短路等等。而求强连通分量用到了Tarjan算法,之后再详细写一篇博客总结。其主要思路就是设置一个dfs顺序的数组。和一个表示该节点可以到达的dfn最小的节点的顺序数组。所以我们的主要思路就是,首先,什么是强连通分量。......原创 2022-07-27 18:14:02 · 203 阅读 · 0 评论 -
114.外星文字典 图论/拓扑排序
其实跟之前hdu的确定比赛名次那题很像。但是麻烦了一点。说是按字典序排的字符串。所以预处理枚举每个字符串第一个不同的字符。然后编号,同时字典序小的哪个字符入度加一。处理完之后拓扑排序即可原创 2022-06-01 19:31:34 · 125 阅读 · 0 评论 -
P3906 Geodetic集合 最短路的点集
P3906 Geodetic集合 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)把无向边看作长度均为1的有向边然后求最短路即可。但是此题需要把所有最短路上的点放入集合。并随机取两点访问,首先会想到floyd,处理完最短路后枚举顶点。设起始点终点为 s ,e 和 k如果满足:则说明k节点在s<->e的最短路上。同理,我们也可以使用dijkstra ,但是dij是单元最短路,此图为无向边,所以需要起点跑一遍最短路,终点跑一遍最短路。然后同样用上面的条件.原创 2022-05-31 10:43:26 · 141 阅读 · 0 评论 -
P1119 灾后重建 Floyd最短路/动态规划
P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)首先不看题目的顶点修补完才能通过,只看询问的方式,是任意两个顶点之间,而且顶点数据小,会想到Floyd求解最短路。但是这题的顶点是动态更新的,每个时间的顶点都不一样。而floyd的思想是基于动态规划,也就是枚举两个顶点对,这两个顶点对的最短路是由其中的一个中间顶点状态转移而来的,所以我们只要每次把新产生的顶点当作中间节点再遍历更新一遍dp数组即可。#include<bits/stdc++.h&g..原创 2022-05-23 20:19:13 · 203 阅读 · 0 评论 -
最短路— dijkstra 松弛操作变形
之前用二分并查集和最小生成树写过,现在学习了dijkstra的解法。。只需要将原算法的松弛操作修改为求最大边的最小值即可。此时dis[i]数组表示起点s到i的最大边的最小值#include<bits/stdc++.h>using namespace std;#define ll long long//#define int ll#define mm(a) memset(a,0,sizeof(a))#pragma warning (disable :4996);const..原创 2022-05-21 17:41:05 · 217 阅读 · 0 评论 -
P1364 医院设置 bfs/最短路
用一层循环枚举起点, bfs以该起点按层搜索遍历整个图,同时记录总路径。因为每个顶点只遍历一次,加上起点枚举复杂度为O(n^2)#include<bits/stdc++.h>using namespace std;#define ll long long//#define int ll#define mm(a) memset(a,0,sizeof(a))#pragma warning (disable :4996);const int N = 1e3 + 10;const..原创 2022-05-21 17:25:55 · 107 阅读 · 0 评论 -
P1807 最长路 拓扑排序/bfs
P1807 最长路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)题目很简单,求1-n的最长路。但是题目中含有负权,不能将dijkstra的松弛反着使用。考虑拓扑排序,从1开始不断pop直到n,期间不断用松弛操作更新最长路径。但是要注意。图中入度为0的点可能不止一个,那么如果从1开始topo,则有些点因为始终有个父节点而无法被遍历到。所以初始要把所有入度为0 的都加入队列。然后在每次更新子节点的时候对各个顶点松弛去最大,这样就可以得到每个顶点的最长路。最后输出dis[n]即可#.原创 2022-05-19 14:17:32 · 590 阅读 · 0 评论 -
四个常用的最短路算法及其细节和应用
一.Dijkstra 单源最短路Dijkstra算法是常用的求单源最短路的算法,他可以求出固定源点到图中其他所有点的最短路。但是他的缺陷也很明显,Dijkstra的缺陷就在于它不能处理负权回路:Dijkstra对于标记过的点就不再进行更新了,所以即使有负权导致最短距离的改变也不会重新计算已经计算过的结果1.普通模板O(n^2)其实思路和最小生成树Prim算法很像,都是从一个起点开始,设定为白区,然后不断向外拓展节点,同时更新到外部蓝区的距离。但是区别在于Prim维护一个dis数.......原创 2022-05-17 19:24:26 · 1582 阅读 · 0 评论 -
P2661 [NOIP2015 提高组] 信息传递 并查集/最小环
P2661 [NOIP2015 提高组] 信息传递 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)题目是求最小的环,同时注意每一轮不能直接合并,必须等该轮结束再合并。有环则取最小值。#include<bits/stdc++.h>#pragma warning (disable:4996);#define ll long long #define int ll#define mem(a,b) memset(a,b,sizeof(a))using na..原创 2022-05-16 12:27:16 · 257 阅读 · 0 评论 -
5.15 训练周记
本周主要学习了最小生成树相关算法,剩下的就都是练习了。这周做的练习有点多,有优先队列的(个人认为难度挺大的)还有并查集和一些图论的题目。打算找个时间写博客总结。一.最小生成树最小生成树单独写了一篇博客,就不过多赘述,主要说说经过练习之后对Kruskal和Prim的一些认识。最小生成树 Kruskal 和 Prim算法及堆优化_Brokenrivers的博客-CSDN博客首先求最小生成树一般有 Prim 算法与 Kruskal 算法,其中,Prim 算法时间复杂度为 O(V*V),与图中边数无原创 2022-05-16 00:11:21 · 157 阅读 · 0 评论 -
P1991 无线通讯网 并查集/最小生成树
P1991 无线通讯网 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)题目其实不难,数据也很水。主要也是套最小生成树的模板,但是这题也算是个变式了,思考和处理边的思路还是很有价值的。题目说的很复杂,其实就是有p个顶点,每个顶点可以和自身半径D以内的顶点相互链接,同时还可以选出其中的s个顶点对他们标记,标记的两个顶点可以相互链接。求使所有顶点相连的最小半径D是读多少。思路:我们可以先不管标记的事,就求出要把所有顶点连起来D最小应该是多少,这个很简单每条边的权就是距离,这也就.原创 2022-05-15 18:07:14 · 181 阅读 · 0 评论 -
最小生成树 Kruskal 和 Prim算法及堆优化
解决最小生成树的问题之前,我们先要明白生成树/最小生成树是什么。对一个具有 n 个点的连通图进行遍历,对于遍历后的子图,其包含原图中所有的点且保持图连通,最后的结构一定是一个具有 n-1 条边的树,通常称为生成树。如果是连通网,则生成树 边的权就是每条边的权的总和。所谓最小生成树,也就是权最小的生成树。一个图的生成树不唯一在生成树问题中,最常见的问题就是最小生成树问题,所谓最小生成树,就是对于一个有 n 个点的无向连通图的生成树,其包含原图中的所有点,且保持图连通的边权总和...原创 2022-05-12 13:26:44 · 2810 阅读 · 0 评论 -
P1396 营救 /二分/并查集/最小生成树
营救 - 洛谷二分答案/并查集处理题意:题目的问法,最大值最小的情况。很容易想到二分,而要让值最小同时肯定也必须到达目的地。所以二分答案,同时并查集合并比这个值小的所有顶点,最后判断目标起点和终点有没有联通调整二分范围。#include <iostream>#include<vector>using namespace std;const int N= 2e4 +10;int pre[N];int fnd(int a){ return pr..原创 2022-05-10 20:29:42 · 265 阅读 · 0 评论 -
5.8 训练周记 图存储/并查集/拓扑排序小结
这两周主要学习了图论的基本存储方式,拓扑排序和并查集。但因时间原因还有一些不太清楚的地方。一.图的存储要对图进行操作,我们首先得有张图。目前学习的对图的存储方式:1.邻接矩阵2.邻接表两种方式各有优劣。总体上来看,邻接矩阵相对简单,对得到一条边的两个顶点,判断其为有无方向,然后两顶点按情况标记即可 cin >> a >> b; if (gra[a][b] == 0) { gra[a][b] = 1;//有向边原创 2022-05-08 23:27:14 · 618 阅读 · 0 评论 -
拓扑排序练习(待补)
HDUProblem - 1285拓扑排序思路:将数据存为有向图,每个顶点的入度即为被打败的次数。首先,第一名没有被打败过,入度为0,弹出,并且剩下的所有被他打败的人的排名都提升了一位,再找出当前情况下的第二个“第一”重复此操作,采用拓扑排序实现//#include<bits/std c++.h>#include <iostream>#include<ctime>#include<math.h>#include<string&.原创 2022-05-06 23:51:53 · 203 阅读 · 0 评论