
图论
sedcftyv
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
无向图的双连通分量
无向图的双连通分量 边双连通分量 指极大的不存在桥的联通分量.去掉桥会使图不连通. tarjan算法,时间复杂度O(n+m) 1.以未建立时间戳的点为起点进行dfs,将该点压入栈中,建立该点的时间戳(f数组)并初始化从该点出发的最小的时间戳(mf数组). 2.遍历以该点为起点的所有终点,若未建立时间戳则继续进行dfs,结束后更新mf数组;否则若不为来时的边上的点,也更新mf数组.如果终点的mf值大于该点的f值,说明这条边是桥. ...原创 2020-06-30 23:22:19 · 147 阅读 · 0 评论 -
有向图的强连通分量
有向图的强连通分量 tarjan算法,时间复杂度O(n+m),可以有重边,自环.有向图的强连通分量是指极大联通分量,其内部所有点互相可达. 1.以未建立时间戳的点为起点进行dfs,将该点压入栈中,建立该点的时间戳(f数组)并初始化从该点出发的最小的时间戳(mf数组). 2.遍历以该点为起点的所有终点,若未建立时间戳则继续进行dfs,结束后更新mf数组;否则若在栈中,也更新mf数组. 3.递归回到该点后,该点的mf值如果等于f值表示它是一个强连通...原创 2020-06-29 23:36:34 · 331 阅读 · 0 评论 -
次小生成树
严格次小生成树 1.先求出最小生成树 2.枚举不在最小生成树上的每一条边,加入最小生成树构成环 3.每个环上找到原来最小生成树上的最长的边和次长的边 4.如果最长的边小于新加的边,将最长边去掉,否则去掉次长的边,如果次长的边等于最长的边,不存在严格次小生成树. 5.求权值 非严格次小生成树只需要找到原来最小生成树上的最长的边去掉即可,允许出现结果权值与最小生成树相同. ...原创 2020-06-24 09:22:32 · 111 阅读 · 0 评论 -
最近公共祖先(LCA)
1.前向星建图 2.预处理i从1到n,lg[1]=0,如果i是2的幂,lg[i]=lg[i-1]+1,否则 lg[i]=lg[i-1]. 3.一次dfs求各节点深度和倍增数组 4.lca查询 先跳到同一深度,若重合直接返回结果,否则同时往上跳,跳到lca下面一个位置,最后返回其父节点。 #include<iostream> #include<cstdio>...原创 2019-10-04 16:56:14 · 147 阅读 · 0 评论 -
差分约束
求最小值转换成最长路,求最大值转换成最短路 最小值xi<=xj+c,出现负环无解,最大值xi>=xj+c,出现正环无解. 常数不等式xi>=c转换成xi>=c+x0,x0为超级源点. 源点需要能到达所有边. ...原创 2020-06-23 11:53:02 · 153 阅读 · 0 评论 -
二分图
染色法判断二分图 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=1e5+10; int h[N],nex[N<<1],to[N<<1],con=1; int c[N],vis[N]; int dfs(int x)//O(n+m)不含奇数环即为二分图 { vis[x]=1; int d=c[x]==1?-原创 2020-06-01 19:09:20 · 120 阅读 · 0 评论 -
最小生成树
Prim算法 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=512,M=2e5+10,inf=0x3f3f3f3f; int h[N],nex[M],to[M],v[M],con=1; int d[N],vis[N]; void prim(int n)//O(n^2) 可处理重边,自环,负权边,负环 { int ans=0; .原创 2020-06-01 16:31:36 · 227 阅读 · 0 评论 -
有向图的拓扑序列
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std; int h[100000*2+10],nex[100000*2+10],to[100000+10],con=1,n; int et[100000+10]; void bfs() { queue<int>q; .原创 2020-05-24 20:11:00 · 388 阅读 · 0 评论 -
前向星
head数组表示以某个点为起点的第一条边 next数组表示以某个点为起点的下一条边 to数组表示边的重点 int con=1; memset(head,0,sizeof(head)); for(int i=1;i<n;++i) { int a,b; scanf("%d%d",&a,&b); ...原创 2019-10-03 16:23:19 · 102 阅读 · 0 评论 -
最短路径
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <string> #include <map> using ...原创 2019-09-17 22:45:24 · 142 阅读 · 0 评论