随笔分类 - 图论
摘要:Tarjan算法 Tarjan求强连通分量 概念: 如果两个顶点互相可达,则它们是 强连通 的。如果一幅有向图中任意两个顶点都是强连通的,则这幅有向图也是强连通的。 强连通分量就是图中具有连通性的一个最大子集,一般可以用来缩点,即相互到达的一堆点可以将他们有用的信息统一到一个点上去。求解强连
阅读全文
摘要:"题目" 差分约束+判正环 差分约束: 给定几个形如aibi=ci的不等式。 一般问题都会问aibj的最小值或最大值,或者是否所有条件都满足。 松弛操作$dis[now] dis[to]y=c);加入原题要问b a的最大值,则转化到图中就是x到y的最小值因为最大值要所有路径都要
阅读全文
摘要:"题目" 题目要求使一条边边权为0时,m条路径的长度最大值的最小值。 考虑二分此长度最大值 首先需要用lca求出树上两点间的路径长度。然后取所有比mid大的路径的交集,判断有哪些边在这些路径上都有出现,然后这些边里面取最大值当做虫洞,如果还是不行说明此mid不行。 判断边可以用把边化为点,然后树上差
阅读全文
摘要:竞赛中找环有许多种问题,判断是否有环,找到环上的点,找到环上的边等等。 而只需要找到环上相邻的两点,或者环上的一条边就可以解决这三个问题。 有向图中,可以用拓扑排序的方法,把将拓扑排序完后限制条件仍未被清零的点即在环上的点。
阅读全文
摘要:"题目" 对于这种题目描述比较长的题,可以考虑简化题意。 简化后的题意: 给定一棵带边权无根树 在其直径上求出一段长度不超过s的路径F, 使得离路径距离最远的点到路径的距离最短。求最短距离。 根据题目范围,直接暴力floyd求多源最短路径。然后n2求出直径和直径端点。搜索求出直径上的点。然后再
阅读全文
摘要:"题目" 求树的直径,因为任意两个居住点之间有且只有一条通路,所以这是一棵树。 根据题意父母先从C去A,再去B,或者反过来。 我们一定是要让A到B最大,也要让C到A和B的最小值最大。 AB最大一定就是直径了。 CA最大直接先求出任意一条直径的两个端点,必定一个是A、一个是B。然后枚举C,找到最大的$
阅读全文
摘要:"题目" 图论综合题。 首先我们需要求出所有在公共最短路上的边,可以用预处理出最短路长度,然后枚举每一条边,依次判断即可。然后把这些边建到一个新图里,跑DP就好了。 此题的关键就是求出在公共最短路上的边。 c++ include define N 7001011 using namespace st
阅读全文
摘要:"题目" 倍增 直接用图论算法必然解决不了这个问题,所以可以使用倍增算法优化。 我们遇到这个题该怎么想,首先,题目要求的值是1到n的最小代价。代价是路径的二进制中1的个数。 我们先预处理出每两点之间是否有边权和为(1 define N 1000111 define int long long usi
阅读全文
摘要:SPFA和DIJ求最短路的算法的坑点一直是很多的。经常会让人搞不懂。 易错案例: 用重载运算符来排序,如: 这种做法是不对的,该dis值在堆里不会更新甚至会堵住。 正确案例: 目前只有两种优化算法最可靠,分别为优先队列来优化spfa或dij。 SPFA: 每次从堆中只需要取出到t的最短路最小的元
阅读全文
摘要:"题目" 最短路+DP 最短路可以用floyd或者spfa来处理出1到n的所有时间区间的最短路。 dis[i][j][k][l]表示i到j在k,l时间内每个时间点都能走的节点的i,j之间的最短路。 因此我们可以预处理出来最短路,然后开始DP,设置dp[i]为1到i之间的所有时间的最短
阅读全文
摘要:"题目" LCT,或者并查集水过。 首先并查集这道题不能路径压缩,因为路径压缩是为了用牺牲一些信息的方法来加快速度,可是这道题我们需要这个信息,所以不能路径压缩。 剩下的操作就只剩下了暴力并查集,而每次查询前都要使u所在的树换根,使u换为该树的根,可以方便查询。
阅读全文
摘要:"题目" 割点模板题。 可以将图中的所有点分成两部分,一部分是去掉之后不影响图的连通性的点,一部分是去掉之后影响连通性的点,称其为割点。 然后分两种情况讨论,如果该点不是割点,则最终结果直接加上2 (n 1)。如果是的话,就求子树的每块连通块大小。 一个点的子树可以分成两类:存在返祖边或不存在。 对
阅读全文
摘要:"题目" 作为NOIp2017D1T3 这个题还是很良心的,至少相对于NOIp2018来说,希望NOIp2019不会这么坑吧。 这个题可以作为记忆化搜索的进阶题了,做这个题的方法也是多种多样。 30pts 30分可以直接套用最短路计数的模板直接套上就可以了。 100pts 100
阅读全文
摘要:"题目" 这个提示一个简单的最短路计数,除了用数组存上最短路的个数的做法以外,还有可以在得出最短路之后,搜索加剪枝的方法来通过该题。 可以反向搜索用A 的方法来通过,但是这个题的去重十分的恶心,需要一些玄学操作。 Code c++ // luogu judger enable o2 includ
阅读全文
摘要:"题目" 我们首先考虑该题没有环应该怎么做,因为没有环所以是一个DAG,因此直接加上入度为0的罪犯,而有环则可以缩点,之后就成为了DAG,然后用一方法做就好了。 Code c++ include include include include include using namespace st
阅读全文
摘要:"题目" 此题主要是考察二分图匹配,而二分图匹配最主要的就是建图,而图一般都是要分成两个部分来分,比如该题就需要先将在学校住的人和床连在一起,因为在学校住就会与一个床。然后每两个人之间假如他们相互认识就可以相互连边,这样就可以通过人人相连实现人床相连。 Code c++ include incl
阅读全文
摘要:打井 "题目" 该题是一个最小生成树的好题,但是比起一般的最小生成树来说他不仅仅有各个井相连,而且还要和地下水相连,所以地下水我们也可以看成一口井。 代码 cpp include using namespace std; struct edge { int a, b, c; }e[100100];
阅读全文
摘要:次短路 次短路,顾名思义即是除了最短路以外最短的路径,如果把最短路比作皇帝,那么次短路就是宰相的关系。 在信息学竞赛中,常常会用两种方法来求次短路。 1.最短路算法 这种和求最短路的方法相同,仅仅只是更改松弛时的操作,就相当于是求一个区间内的最大值和次大值一样,用两个数分别保存最大值和次大值,因此可
阅读全文
摘要:"最短路计数" 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用SPFA预处理出所有点的最短路,然后我们反向记忆化搜索,可以用sum[i]表示从i到1的最短路个数,然后我们初始化sum[1]=1,然后就可以了 代码: c++
阅读全文
摘要:LCA LCA即最近公共祖先,在我们进行树上的某些毒瘤操作的时候,常常需要知道它的值,因此就出现了许多用来求LCA的代码。 倍增 而倍增则是其中最好写,最好理解,支持的操作比较多(比树链剖分要少)的一个算法了,所以本文只介绍该算法~~才不是因为我不会~~。 思想 思想顾名思义就是倍增了,
阅读全文