
图论
_zpf
这个作者很懒,什么都没留下…
展开
-
网络流——最大流
网络流的基本概念(参考算法导论)流网络的的定义:流网络是一个有向图;每条边都有一个权值;有两个特殊的节点,一个是结点s,另一个是汇点t;每个可行流都会从节点s流向节点t。网络流的两个性质:容量限制:顾名思义就是每条边的流量不能超过边的最大容量。流量守恒:对于每个节点,流入的流量等于流出的流量。基尔霍夫水流定律残存网络的定义:在一个图中,如果确定了一个可行流,那么就存在唯一的残流网络与之对应。残流网络的求法是:将图的正向边容量减去当前可行流的流量;同时,将每一个正向边建立一个与之对应的反向原创 2021-09-26 13:14:42 · 403 阅读 · 0 评论 -
割点与割边
在无向图中,所有能互相连通的点组成了一个“强连通分量”。在一个连通分量中有一些关键的点,如果删除它,就会把这个连通分量分成两个或者更多,这种点就称为割点。类似的有割边,在一个强连通分量中,如果删除一个边,把这个连通分量分成两个,这个边就称为割边。...原创 2021-09-11 11:24:13 · 418 阅读 · 0 评论 -
2-sat问题
2-sat问题是确定N个bool变量的值,使其满足所有限制关系。2-sat问题无解当且仅i和i‘强连通先将所有的条件表示出来,再对原图求强连通分量int h[N][2],to[M][2],ne[M][2];int cnt1,cnt0;int add(int a,int b,int c){//1代表正向建图,0代表反向建图 if(c==1){ to[cnt1][c]=b;ne[cnt1][c]=h[a][c];h[a][c]=cnt1++; } else { to[cnt0][c]=原创 2021-08-30 22:41:54 · 117 阅读 · 0 评论 -
树链剖分和lca
树链剖分需要预处理五个变量d[x]表示x的深度f[x]表示x的父亲size[x]x点为根的子树大小son[x]表示x的重儿子top[x]表示所在重链的顶端树链剖分需要做两次dfs,第一次dfs求出前四个值。第二次dfs求出最后一个值。最近公共祖先的求法:1.若x和y在同一条重链中,那么lca就是深度较小的那个点2.否则就将top的深度较大的那个点往上跳到top的父亲,这一步跳过了一条轻边3.不断重复第二步直到x和y在同一条重链中。#include<bits/stdc++.h&g原创 2021-08-28 22:22:09 · 138 阅读 · 0 评论 -
图论模板总结
图论模板总结单源最短路问题多元最短路问题(待补充)最小生成树spfa求负环有向图强连通分量无向图的双连通分量差分约束最近公共祖先二分图欧拉回路拓扑排序单源最短路问题单源最短路有三种算法,分别是朴素的dijistra算法,堆优化的dijidtra算法,和spfa算法前面两种算法不能解决负权边朴素版dijistra算法 复杂度:n*nint ne[M],to[M],h[N],w[M];int cnt;int vis[N];int dist[N];void add(int a,int b,in原创 2021-08-26 21:28:04 · 587 阅读 · 0 评论 -
kosaraju算法 求解有向图强连通分量
在有向图中,按照1到n的顺序去dfs后序遍历原图,得到每个点的出栈序列q按照q[n]………q[1]的顺序去dfs反图,依次得到每个强连通分量经典例题:点对统计(hdu)给定一个有向图,统计有多少点对u,v(1≤u<v≤n)满足u可以到达v,且v可以到达u。#include<bits/stdc++.h>using namespace std;#define N 100100#define M 200100typedef long long ll;int h[N][2原创 2021-08-26 13:02:40 · 193 阅读 · 0 评论 -
判断负环算法
负环的定义负环是指权值和为负数的环。负环会使图的最短路径计算陷入死循环,因此,存在负环的图不存在最短路。负环的计算方法:负环有两种计算方法,都是基于Bellman-Ford算法或者SPFA算法。第一种算法是:统计每个点的入队次数,如果某个点入队大于等于n次,则说明有负环第二种算法是:统计到某个点的最短路所经过点的个数,如果经过n个点,则说明存在负环。...原创 2021-07-17 20:40:05 · 1289 阅读 · 0 评论 -
最小生成树的两种算法及证明
一些基本概念连通图:在一个图中,如果任意两点都连通,那么这个图就是一个连通图生成树:连通图的一个连通子图最小生成树:在连通图的所有生成树中,边权和最小的生成树称为最小生成树。最小生成树的Kruskal算法Kruskal算法是一种基于并查集的最小生成树算法,也称为“加边法”。Kruskal算法的基本步骤如下:将所有的边排序。从小到大取出边权最小的边,如果两点不在同一集合就将边的两点连通。直到遍历完所有边就停止循环。Kruskal算法的时间复杂度是O(mlogm)Prim算..原创 2021-07-11 13:04:11 · 766 阅读 · 0 评论 -
spfa算法
spfa算法简介spfa算法是shortest path fastest algorithm的缩写。再通常情况下,是一种比较高效的求解最短路的算法。spfa的本质是广度优先搜索,将图所有的边都遍历一遍。时间复杂度是O(m),其中m是图的边数。spfa算法的用途spfa算法用来解决单源最短路问题,可以求解从某个点开始,到图中其他所有点的最短距离。spfa算法的实现步骤实现spfa算法需要一个队列q,一个标记数组vis[N]用来标记某点是否已经被搜索过。数组dist[N],用来存储起点到..原创 2021-07-08 19:23:26 · 9961 阅读 · 11 评论 -
迪杰斯特拉算法及其堆优化
迪杰斯特拉算法及其堆优化迪杰斯特拉算法是一种求解图的单点最短路径的算法。迪杰斯特拉算法的原理是1.首先在没有中间节点的情况下,也就是直达路径中找到到达某点p的最短路径。易知,该路径一定是原点到点p的最短路径。将点p标记在vis数组中,并将最短路径的值存在dist数组中。2.再对所有节点进行松弛操作,也就是下一个节点的最短路径有两种情况,一种是经过某个已知的最短路(就是被vis标记的最短路径),第二种情况是直达。所以,求解下一个最短路径就是求解递推公式dist[i]=min(dist[i] , ma原创 2021-03-22 17:06:56 · 4406 阅读 · 0 评论 -
拓扑排序(链式前向星+邻接表)
拓扑排序(链式前向星+邻接表)拓扑排序是一种已知各个量之间的大小关系,然后进行排序的排序方法;拓扑排序的原理是记录每个节点的入度,然后找到入度为0的节点,输出。之后将与该节点连接的所有节点的入度-1,再重复以上步骤。例如,给出数据点1>点2点2>点3点4>点3注:如果出度都为0,那么输出节点较小的点。链式前向星法:#include<bits/stdc++.h>using namespace std;int head[100100];//节点数组,里面存储下原创 2021-03-21 17:47:26 · 379 阅读 · 0 评论 -
有环图的判定
有环图的判定次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。原创 2021-02-15 20:35:45 · 651 阅读 · 0 评论