图论
文章平均质量分 92
图论算法整理
as_sun
这个作者很懒,什么都没留下…
展开
-
单源最短路的综合应用例题整理
这里有五个点需要被遍历到,要求遍历完五个点总路程的最小值,那么首先的问题就是确定这五个点的遍历顺序,显然我们需要dfs一下,然后我们还需要知道任意两点之间距离的最小值,很容易想到floyd算法,但是这道题n的范围有些大,并不支持floyd算法,但我们注意到我们只用知道这6个点之间的关系就可,那么我们可以在每个点的位置做一次单源最短路,这样的话时间复杂度是支持的。然后还有一个问题,可能会质疑最大值出现在最小值前面的情况,但是我们并不是将第一次出队时的值就视为答案,如果是双向边,那么前面的也可以更新后面的。原创 2024-02-15 13:51:39 · 773 阅读 · 0 评论 -
单源最短路建图方式例题整理
然后我们就时间复杂度进行分析,朴素版dijkstra算法的时间复杂度是O(n^2),本题的点数是2500,n^2=6250000,数量级1e6,可以过;虽然这里是最大,但是我们存边可以存成实际的百分数,那么就会越乘越小,所以当一个位置第一被作为最大的挑出来的时候,就是此处最大的位置。然后去搜到终点的最短路。然后就是考虑时间复杂度的问题,朴素版O(n^2)=1e4,堆优化O(mlogn)=400,spfa一般O(m)=200 最坏O(nm)=2e4,所以三种算法都可以,这里还是本着复习的想法全部写一遍。原创 2024-02-14 20:51:24 · 932 阅读 · 0 评论 -
单源最短路的扩展应用
首先要解决的第一个问题就是这里的我们只给出了有门和有墙的状态,剩下的那些可以直接到的点之间的关系需要我们手动来建,这里建边的时候,门位置可以在输入的时候就建边,墙位置不能建边,所以要判断两点之间是否是墙,可以将所有的墙都记录下来,直接连通的位置也是要建边的,但是需要与门区别,我们将边权定义为0.思路:这里要求的是最短路的条数,我们联想到dp中的方案数来解决这道题。还有,这道题求的是时间花费,只有移动是花时间的,所以我们拾钥匙的操作花费的时间是0,移动花费的时间是1,所以我们实际上可以通过双端bfs来实现。原创 2024-02-15 18:07:13 · 605 阅读 · 0 评论 -
最短路相关模型及应用整理
这里我们开始分析最短路问题,我们先来看最基础的最短路算法:下面我们分析下每种算法的思路,并不展开论述例题,例题的分析求解放在最后的链接里。原创 2024-02-17 23:34:24 · 586 阅读 · 0 评论 -
欧拉回路和欧拉路径
但是这里如果仅仅通过h[u]=ne[i]来删除,后面遍历时可以生效,但是回溯到前面遍历并不是再从开头开始,所以并没有生效(或者换个角度来理解,我们的删除相当于直接将头节点的指针往后移,但是中间节点的指针是没有改变的,所以实际上前面的循环应该已经到了中间那么节点的部分,它们之间的指向关系并没有改变,仍然会产生新的递归循环)时间复杂度还是很高,那么该如何处理呢,我们这里通过传入指针来实现动态的删除。所以可以见得,判断欧拉回路和欧拉路径,只要判断度和连通性的性质满足即可,方法不唯一。1124. 骑马修栅栏(原创 2024-02-22 21:07:45 · 604 阅读 · 1 评论 -
无向图的双连通分量
思路: 本题要求删除一个点之后还剩多少连通块,首先在连通块内部删除一个点,对其他的连通块是不产生影响的,那么就需要考虑删除这个后在连通块内部产生多少个新的部分,首先如果这个点不是割点,而是属于一个连通分量中,那么删除之后也不会产生任何影响,所以只有割点被删除才会产生影响,所以问题的核心就是找割点,那么就可以直接用tarjan算法了,不过还有一点比较麻烦的在于还需要判断这个点是否是根节点,如果不是根节点,那么删除后除了子树还需要多一个连通块。点连通分量不一定是边连通分量,边连通分量不一定是点连通分量。原创 2024-02-21 15:57:24 · 557 阅读 · 0 评论 -
最近公共祖先(LCA)
先kluskal求出最小生成树,然后根据最小生成树建一张无向图,然后用倍增法写lca,在lca预处理的时候,将d1[i][k]、d2[i][k](i上跳2^k的过程中的所经过的边的最大值和次大值)预处理出来,对所有的非树边执行lca查询,在lca查询的时候,将两个到最近公共祖先的过程中经过的所有最大值和次大值存下来,然后找出总的最大和次大,进行计算,返回结果。这里我们对于一条非树边,它们的最短路径上所有的边的值都要加1,这里可以利用差分实现,即,两点的d各加1,lca的d减2.1.遍历过还没有回溯过的点。原创 2024-02-20 11:50:52 · 900 阅读 · 0 评论 -
最小生成树算法及例题整理
本题看似麻烦,但是既然涉及到最小生成树,那么我们可以想一想最小生成树的建立过程,我们从kluskal的角度来考虑,每次建边,就是将两个 不连通的集合连通,两个不连通的集合就说明除了当前这条边以外,两个集合没有任何边相连,如果要得到完全图,那么很显然两个集合之间要建立更多的边,这些边的具体数目取决于两个集合的大小。这个算法的思路就是将所有的边排序,然后从小到大遍历所有的边,如果这条边连接的两点不在一个集合中,那么就将它们并成一个集合,否则就略过这条边。最开始连通块的数量肯定是n,每连接一次,那么数量就少1.原创 2024-02-19 10:54:47 · 1088 阅读 · 0 评论 -
拓扑排序模型及例题整理
这里有个条件,如果在x停靠,那么所有等级大于等于x的都要停靠,所以我们对于每一趟车统计哪些站停靠,哪些站没停靠,最好的情况就是假定所有停靠的点等级都相同,且比未停靠的点大1,那么就可以用差分约束那里的建边方式来建边,但是由此来看的话,需要建的边实在太多了,我们可以引入虚拟点,即在对于每一趟车假定一个虚拟点,从未停靠的车站到虚拟点建一条长为0的边,从虚拟点到停靠车站建一条长度是1的边。统计的时候稍有不同,因为我们不能只是数值上的累加,这样的话就会有点被重复计算,我们需要确切的直到当前点可以到哪些点。原创 2024-02-22 20:57:12 · 338 阅读 · 0 评论 -
spfa的特殊用法
spfa通常用来求带有负权边的最短路问题,但是它还有两种特别的用法——求负环和求差分约束。原创 2024-02-19 21:13:10 · 853 阅读 · 0 评论 -
二分图模型即状态整理
思路:首先我们注意到,需要将所有罪犯分到两个监狱中去,那么联想到二分图,二分图的要求就是边全部在两个集合之间,集合内部没有边,但是这里显然不能保证图是符合要求的,但是我们要求的是最大值最小,所以考虑二分,对于一个二分值,如果小于等于这个二分值的可以分进一个监狱,否则就必须分进两个监狱,那么从二分图的角度来看,相当于只保留了大于二分值的边。对于一个点,它能攻击到的点与它的横纵左边之间的总差值应该是一个奇数,那么就会改变奇偶性,那么我们按照奇点偶点分成两个集合,那么就是一个二分图。得到的路径是一个增广路径。原创 2024-02-21 19:19:33 · 753 阅读 · 0 评论 -
有向图的强连通分量
我们建边的时候就跟糖果那道题一样建边,如果a>=b,那么就建一条b指向a,长度为0的边,如果a>b,那么就建一条b指向a,长度为1的边,然后计算强连通分量,再缩点成有向图,起点的亮度是1,递推求总和。另外,一个强连通分量的各个点亮度应该是相同的,所以所有的边权都应该是0,否则就不成立,输出-1,我们在缩点的时候记录一下。那么p2和q1就变成中间节点了,可以从起点和终点的集合中去掉,那么大小同时减1,然后可以去p-1次,变成p==1的情况,那么还需要加q-(p-1)条边,那么总共就加了q条边。原创 2024-02-20 16:48:02 · 970 阅读 · 0 评论 -
Floyd算法例题整理
这题还有一个难点在于需要将环输出,这个其实可以由最短路的特性得到,我们来想一下,虽然是分了n类来看,但是我们实际上只要维护一个变量来存最小值即可,最小值每次更新的时候,就说明有一个环了,我们可以用一个数组来存这个环,显然环上有i,j,k三点,那么问题就转化成中间的那些路径该怎么求,中间的那些是如何得到的呢,显然是在更新d[i][j]的时候得到的,那么我们只需要记录一下d[i][j]是被哪个中间点更新的即可还原路径(用递归实现)。思路:题目的意思很清楚,需要求一个环,环的要求是边的长度之和最小。原创 2024-02-17 23:32:45 · 799 阅读 · 0 评论