随笔分类 -  图论

摘要:基环树 基环树直径 P3248 #include<bits/stdc++.h> using namespace std; #define ll long long const int N=1e5+5; int n; int te,v[N<<1],pre[N<<1],tail[N]; ll L,len 阅读全文
posted @ 2020-11-26 21:11 林生。 阅读(89) 评论(0) 推荐(0)
摘要:Tarjan 模板 void tarjan(int u,int fa) { //最初能到达的dfn最小的点为其本身 dfn[u]=low[u]=++tdfn; for(int i=tail[u];i;i=e[i].pre) { int v=e[i].v; //如果这个点还没到达,就走一走 if(!d 阅读全文
posted @ 2020-10-23 20:35 林生。 阅读(170) 评论(0) 推荐(0)
摘要:二分图 没有网络流不能做的二分图!(不是) 二分图最大匹配模板 最小点权覆盖也是如此。 #include<bits/stdc++.h> using namespace std; const int N=505; int n,m,e,ans,bp[N],cnt[N]; bool d[N][N],vis 阅读全文
posted @ 2020-10-23 20:33 林生。 阅读(84) 评论(0) 推荐(0)
摘要:网络流 一、基本概念 1、流 A、网络流问题 给定指定的一个有向图,其中有两个特殊的点:源S,汇T。 每条边有指定的容量,求满足条件的从S到T的最大流。 通俗解释:汇T为你家,源S为自来水厂,边即自来水厂和你家之间修的水管子,容量即水管子容量,有的大有的小。自来水厂开闸放水,问你家收到的水最大流量是 阅读全文
posted @ 2020-10-23 20:31 林生。 阅读(465) 评论(0) 推荐(0)
摘要:Tarjan算法与无向图连通性 缩点 int tdfn,c[N],dfn[N],low[N],tak[N]; bool ins[N]; void tarjan(int u) { dfn[u]=low[u]=++tdfn; tak[++tak[0]]=u; ins[u]=1;//在栈里 for(int 阅读全文
posted @ 2020-10-23 20:11 林生。 阅读(138) 评论(0) 推荐(0)
摘要:差分约束问题 区间 给定 n 个区间$ [ai,bi]$和 $n \(个整数\) ci$。 你需要构造一个整数集合 Z,使得∀i∈[1,n],Z 中满足ai≤x≤bi的整数 x 不少于 ci 个。 求这样的整数集合 Z 最少包含多少个数。 输入格式 第一行包含整数 n。 接下来n行,每行包含三个整数 阅读全文
posted @ 2020-10-23 20:10 林生。 阅读(113) 评论(0) 推荐(0)
摘要:负环 SPFA:检查cnt[u]是否大于n-1 DFS/BFS:可更新的点是否已经到过 阅读全文
posted @ 2020-10-23 20:08 林生。 阅读(86) 评论(0) 推荐(0)
摘要:次小生成树 给定一张N个点M条边的图,在其生成的所有树中权值大小仅次于最小生成树的树被称为次小生成树。 结合模板题进行讲解。 次小生成树 给定一张 N 个点 M 条边的无向图,求无向图的严格次小生成树。 设最小生成树的边权之和为sum,严格次小生成树就是指边权之和大于sum的生成树中最小的一个。 输 阅读全文
posted @ 2020-10-23 20:06 林生。 阅读(90) 评论(0) 推荐(0)
摘要:树上差分 引理:差分序列的前缀和是原序列。 原数列 9 4 7 5 9 前缀和 9 13 20 25 34 差分数组 9 -5 3 -2 4 前缀和的差分数组 9 4 7 5 9 差分数组的前缀和 9 4 7 5 9 树上差分即将区间操作转化为路径操作。 点差分 边差分 闇の連鎖 传说中的暗之连锁被 阅读全文
posted @ 2020-10-23 20:04 林生。 阅读(102) 评论(0) 推荐(0)
摘要:最近公共祖先_LCA 给定一棵有根树,若节点z即可以到x也可以到y,则称z为xy的公共祖先,公共祖先中深度最大(即距离x,y最近)的则是xy最近公共祖先,称为LCA(x,y)。 以洛谷的**P3379【模板】最近公共祖先(LCA)**进行讲解: 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直 阅读全文
posted @ 2020-10-23 20:01 林生。 阅读(156) 评论(0) 推荐(0)
摘要:树的直径 树中最远的两个节点之间的距离或者路径被称为树的直径。 树的直径一般有两种写法,时间复杂度都为O(n)。 树形DP 以1号节点为根,d[x]表示从x节点出发可达的最远距离,f[x]表示过x节点的最长路径长度。 对于每个x,扫描到x的第i个子树,d[x]储存了从x到1~i-1的子树的点的最远距 阅读全文
posted @ 2020-10-23 20:00 林生。 阅读(222) 评论(0) 推荐(0)
摘要:最小生成树 Kruskal算法O(mlogm) 按边扫描,选边加入树,使每个子树都最小,一边加边一边合并,最后得到整棵树。 1.建立并查集,每个点个字构成一个集合。 2.将所有边按照w大小排序,依次扫描每条边(u,v,w)。 3.如果u,v属于同一集合(即相连,存在长度更小的使u和v相连的边),则跳 阅读全文
posted @ 2020-10-23 19:49 林生。 阅读(146) 评论(0) 推荐(0)
摘要:最短路 单源最短路径 Dijkstra算法O(mlogn) 每次找到离出发点距离最近的且未被使用过的点,用此点去更新其他点。 1.初始化$dis[1]=0$,其余节点dis值为正无穷。 2.找出一个未被标记的,dis[u]最小的节点x,然后标记节点u。 3.扫描节点u的所有出边(u,v,w),若$d 阅读全文
posted @ 2020-10-23 19:46 林生。 阅读(104) 评论(0) 推荐(0)
摘要:遍历所有边 看牛 给定N个点M条边的无向图,求一条路径,从节点1出发,最后回到节点1,并且满足每条边恰好被沿着正、反两个方向分别经过一次。 若有多种方案,输出任意一种即可。 输入格式 第一行包含两个整数N和M。 接下来M行每行包含两个整数a和b,表示点a和点b之间存在一条边。 输出格式 共2M+1行 阅读全文
posted @ 2020-10-23 19:45 林生。 阅读(318) 评论(0) 推荐(0)