![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
文章平均质量分 64
图论题
Edward The Bunny
这个作者很懒,什么都没留下…
展开
-
图论复习汇总
三元环计数&四元环计数Blogdfs树,点双,边双,强连通分量Blogbfs树对一个图运行 bfs 算法,每个点uuu的父亲定义为第一次遍历uuu时的前驱结点,若无则为根。非树边只存在在同一层的两个点和相邻层的点中。hihoCoder1147 时空阵题意:问111号点到nnn号点距离恰好为mmm的图的个数。图的边权为111。n,m≤100n,m \leq 100n,m≤100题解:dp(i,j,k)dp(i,j,k)dp(i,j,k) 表示做了前iii层,上一层用jjj个点,原创 2021-10-20 21:11:39 · 206 阅读 · 0 评论 -
图论复习——最短路
知识点最短路径算法最短路径树每个点uuu的父亲为使uuu得到最短距离的前驱节点,若有多个,则取任意一个。题目CF449B Jzzhu and CitiesBlogCF464E The Classic ProblemBlog[XSY3888] 传送门对每个点uuu,记d(u)d(u)d(u)表示uuu到TTT的最短路,e(u)e(u)e(u)表示删掉它和最短路上父亲的边后的最短路。令dp(u)dp(u)dp(u)表示S=uS=uS=u时的答案。每次找到dpdpdp值最小的点来更新其它原创 2021-10-20 21:06:32 · 208 阅读 · 0 评论 -
并查集小记
有什么用:查询元素a和元素b是否属于同一组合并元素a和元素b所在组代码实现:#include<iostream>using namespace std;int n,m,p;int fa[5001];int find(int x){ if(fa[x]==x) return x; else{ return fa[x]=find(fa[x]); }}int main(){ cin>>n>>m>原创 2021-10-20 17:18:51 · 74 阅读 · 0 评论 -
二分图匹配
定义:二分图:一个图被分成了两部分,相同的部分没有边匹配:二分图G的子图M中,M的边集{E}中的任意两条边都不指向同一个顶点极大匹配:在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹配的边数最大匹配:是所有极大匹配当中边数最大的一个匹配完全匹配(完备匹配):一个匹配中,图中的每个顶点都和图中某条边相关联有什么用:定理1:最小点覆盖数 = 最大匹配数点覆盖:点集合使得任意一条边至少有一个端点在集合中定理2:最大独立集 = 顶点数 - 最大匹配数原创 2021-10-20 17:16:32 · 2546 阅读 · 0 评论 -
欧拉回路&哈密顿回路
欧拉回路总结有向图,无向图,混合图的欧拉回路判定百度百科Fleury算法Hierholzer算法//寻找无向图的欧拉路径#include<iostream>#include<vector>#include<stack>using namespace std;vector<int> g[1001];int n,m,x,y,d[1001],s=-1,t=-1;bool vis[1001][1001];stack<int> a原创 2021-10-20 17:07:11 · 248 阅读 · 0 评论 -
最小割小记
参考博客:最小割浅谈关于最小割常用描述表述一:删去若干条边使得源点到汇点不连通,求删边的权值和的最小可能值。表述二:将点集分为(S,T)(S,T)(S,T),记所有从SSS中出发到TTT中的边的权值和为c(S,T)c(S,T)c(S,T),求c(S,T)c(S,T)c(S,T)的最小值。求最小割a. 以权值为容量,该网络最大流的值即为最小割的值b. 在残量网络中,从源点出发进行一次增广BFS,即得到一个分割。该分割是一个最小割。题型1:对求最小割原理的理解[AHOI2009]最原创 2021-10-19 22:29:48 · 254 阅读 · 0 评论 -
[POI2015] Pustynia(差分约数,线段树优化建图,拓扑)
传送门Description给定一个长度为n的正整数序列aaa,每个数都在111到10910^9109范围内,告诉你其中sss个数,并给出mmm条信息,每条信息包含三个数l,r,kl,r,kl,r,k以及接下来kkk个正整数x1,x2,...,xkx_1,x_2,...,x_kx1,x2,...,xk,表示a[l],a[l+1],...,a[r−1],a[r]a[l],a[l+1],...,a[r-1],a[r]a[l],a[l+1],...,a[r−1],a[r]里 a[x1],a[x2],..原创 2021-10-19 16:05:39 · 134 阅读 · 0 评论 -
图论复习——dfs树,点双,边双,强连通分量
https://blog.csdn.net/weixin_43848437/article/details/105133155https://www.cnblogs.com/lcfsih/p/14391394.html#/c/subject/p/14391394.htmlhttps://blog.aor.sd.cn/archives/418/http://blog.sina.com.cn/s/blog_64675f540100s4nv.htmlhttps://www.cnblogs.com/JiuP原创 2021-10-14 21:04:13 · 1404 阅读 · 0 评论 -
MST(最小生成树)的构造
是什么:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。kruskal算法:#include<iostream>#include<vector>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;struct node { int x,y,t;};int n原创 2021-10-14 13:51:26 · 314 阅读 · 0 评论 -
图论复习——最小生成树MST
MSTBoruvka算法https://acxblog.site/archives/boruvka.html题CF888G Xor-MSTBoruvka + 01Trie树Boruvka算法简介:对图中所有的点iii,找到iii连向其它点的最小边,如果这条边还没加进MSTMSTMST,就把它加上。执行完后,把每个连通块缩成点。不断重复上面的操作,直到只剩下一个连通块。时间复杂度O((m+n)logn)O((m+n)logn)O((m+n)logn)此题中,要让ai⊕aja_i \opl原创 2021-10-14 12:50:11 · 447 阅读 · 0 评论 -
[XSY]Tree Ext(矩阵树定理,拉格朗日插值,最小生成树,二分)
Tree Ext这道题相当于把3道题合了起来。要求修复的边中恰好有 k 条白边:五颜六色的幻想乡(附拉格朗日插值法求多项式系数 )+bzoj2654 tree(WQS二分 新科技get)是最小生成树计数而非生成树计数:BZOJ1016」[JSOI2008] 最小生成树计数具体可以看看这篇博客,代码中的注释也解释得较清楚#include<bits/stdc++.h>#define int long longusing namespace std;const int mod=原创 2021-07-21 10:05:38 · 150 阅读 · 0 评论 -
[XSY] 绿色(圆方树、树形DP、树上差分)
绿色题意简述题解首先,每次修改完点权后,重新考虑一遍所有路径显然是不现实的,所以我们考虑求出经过每个点的两端同色的简单路径数,这样权值和容易统计和修改。接下来分析仙人掌上的简单路径性质。一条简单路径上的边,可以分为桥边和环上的边。过桥只有一种方法,而过同一个环有两个方向的环边可选。现在,我们选取一个关键点,强制简单路径必须通过该点。如果关键点在一个环上,且该简单路径在该环上的第一个和最后一个点均不是关键点,那么该环只有一个方向的环边可选。建立原仙人掌的圆方树。如果定义方点贡献 2 种方案,原创 2021-03-29 20:40:26 · 162 阅读 · 0 评论 -
拓扑排序
定义:对于有向图中的任意两个结点u和v,若存在一条有向边从u指向v,则在拓扑排序中u一定出现在v前面。(对于同一个有向图而言可能存在多个这样的结点排序)有什么用:限制先后顺序。常用的有求拓扑序,或者在DAG(有向无环图)上DP。ps:当图不是DAG时,可以先缩点成DAG再用拓扑序DP另附DAG上DP的常见两种方法代码实现:#include<iostream>#include<queue>#include<vector>using namespace原创 2021-03-08 21:32:40 · 140 阅读 · 0 评论 -
最短路径
SPFA (Bellman-Ford 的队列优化版本):1、求单源最短路径,即每个点到源点的最短距离2、可以处理负权边的情况3、可以判断是否出现负权回路#include<iostream>#include<vector>#include<cstring>#include<queue>using namespace std;struct node{ int x,y,t;};int n,m,dis[10001],count[10001原创 2021-03-08 21:25:08 · 169 阅读 · 0 评论 -
MST(最小生成树)上的确定性和存在性问题
题目1:给定一个n个点m条边的连通图,保证没有自环和重边。对于每条边求出,在其他边权值不变的情况下,它能取的最大权值,使得这条边在连通图的所有最小生成树上。假如最大权值为无限大,则输出-1。题解:先求出图的一棵最小生成树:对于不在树上的边(x,y), 它的权值只要小于树上x到y路径中任意一条边就可以代替这条边。对于在树上的边(x,y),可以先预处理出所有两端在x到y路径上的不在树上的边的最小值。它的权值一定要小于最小值。路径max和min都可以用倍增求。时间复杂度O(nlogn)#inclu原创 2021-03-05 21:22:54 · 361 阅读 · 0 评论 -
CF1120D Power Tree(树形DP/构造+差分+最小生成树)
解法一:树形DP个人觉得这个方法是比较可能想到的,但是输出方案很恶心先转换题意:“无论怎样规定叶子的初始点权,都可以通过操作你选择的点来让所有叶子的点权清空”意味着每个叶子节点都可以通过一系列操作单独+1、-1模拟一下就可以发现,以u为根的子树中,要想通过控制 uuu 或 uuu的祖先(不管是 uuu 还是 uuu的祖先 都同时覆盖了子树内的所有叶子节点)使子树内所有叶子节点均可以单独+1、-1,至多一个叶子节点未被覆盖,且被覆盖的叶子节点一定要可以单独+1、-1那么状态定义就很显然了:f原创 2021-03-05 21:20:40 · 396 阅读 · 0 评论 -
Kruskal重构树
建树模仿kruskal的过程,先将边权排序依次遍历每条边若该边连接的两个节点u和v不在一个并查集内就新建一个结点node该点点权为这条边的边权找到u,v所在并查集的根 fufufu,fvfvfv连边(node,fu)(n o d e , fu )(node,fu) (node,fv)( n o d e , fv)(node,fv)并更新并查集fa[fu]=nodef a [ fu ] = n o d efa[fu]=node , $f a [ fv ] = n o d e $遍历完原图所有原创 2021-03-05 21:17:14 · 119 阅读 · 0 评论 -
CF732F Tourist Reform(dfs树、边双连通图、tarjan)
因为知道了算法tag,所以想到了正解:先给出两个性质:边双给边定向一定可以转为强连通图,此为最优解树给边定向后R的最小值必为0性质2证明如下:设树有n个节点,若R_min!=0,则每点出度至少为1,各点出度之和至少为n,则至少有n条边,但树只有n-1条边,矛盾那么这道题只要在原图上把边双缩成点即可问题是如何构造?要解决树的构造很简单,因为树上必有一点无法到达其它节点,而我们又要令R_min最大,那么就令这个无法到达其它节点的点为 包含点的个数最多的边双 代表的点 ,把这个点当做原创 2021-03-05 21:14:35 · 259 阅读 · 0 评论 -
三元环计数&四元环计数
三元环计数问题给出一张n个点m条边的无向图,问图中有多少个三元组{ u , v , w } ,满足图中存在 { (u,v) , (v,w) , (w,u) } 三条边。求解Step1 定向将所有点按 度数 从小到大排序,如果度数相同按 点编号 从小到大排序,u的排名记作 rnkurnk_urnku。将这张图转化为有向图:对于一条无向边 x − y ,若 rnkx>rnkyrnk_x>rnk_yrnkx>rnky,那么就将这条无向边变成 x → y 。反之则反之。这样转化原创 2021-03-05 21:11:48 · 1676 阅读 · 0 评论 -
有上下界网络流问题汇总
无源汇有上下界可行流法一(据说适合点少边多的图):建图方法首先建立附加源点ss和附加汇点tt对于原图中的边x->y,若限制为[b,c],那么连边x->y,流量为c-b对于原图中的某一个点i,记d(i)为流入这个点的所有边的下界和减去流出这个点的所有边的下界和若d(i)>0,那么连边ss->i,流量为d(i)若d(i)<0,那么连边i->tt,流量为-d(i)求解方法在新图上跑ss到tt的最大流若新图满流,那么一定存在一种可行流此时,原图中每原创 2021-03-05 21:09:13 · 135 阅读 · 0 评论 -
[XSY] 分割(dfs树)
题目相当于问 删掉两个点后 图是否仍然连通割点问题,考虑用dfs树解决设删去点u,v(dfn[v]<dfn[u])把 u, v 删去之后整棵树大概断成了几个部分:• v 上面到根的部分,以及上面挂着的那些东西,记作 highhighhigh;• u 到 v 之间的那一段,以及上面挂着的那些东西,记作 midmidmid;• u ,v的子树们,记作 lowulow_ulowu,lowvlow_vlowv。要保证删去u,v后图连通,则lowulow_ulowu,midmidmid,l原创 2021-03-03 22:23:13 · 203 阅读 · 1 评论 -
传送门(最短路树+可并堆)
Description有一张n个点m条边的无向图,求删去任意一条边后,从S到T的最短距离的最大值n, m ≤ 2×1052 \times 10^52×105Solution这道题是[USACO09JAN]Safe Travel的变形,然后这是题解Safe Travel这道题的普遍做法是并查集或树剖,但学长的PDF里提到的是题解讲的可并堆做法,所以我就没采用前两种然后讲回传送门这题,首先考虑怎么求删掉一条边后相邻两个点到 T 的最短距离。建出最短路树,如果删掉的不是连向父亲的边,则最短路不变,转载 2021-02-01 13:50:10 · 151 阅读 · 0 评论 -
[清华集训2017]无限之环(网络流)
很妙的一道题对于每个格子,它合法与否,只跟它上下左右的相邻格子有关,所以可以想到黑白染色(用 (i,j) 表示 i 行 j 列的格子,我把 (i+j) %2 == 0 的格子染成白色,把(i+j)%2 == 1 的格子染成黑色)关键是怎么描述旋转操作我朴实的想法是给每个格子建四个点,每个点代表格子可通过旋转达到的一种状态,从格子的初始状态向格子其它状态连边,然后把格子间可以匹配的状态连起来,再然后……就没有然后了看了题解,真的被惊到了还是把每个格子拆成4个节点,对应四个方向上的接口从源点向白格原创 2021-01-30 13:27:57 · 307 阅读 · 1 评论 -
[AGC031E] Snuke the Phantom Thief(网络流)
考虑枚举偷的珠宝的个数k,且假设它们按照坐标大小排好了序(x坐标排一次,y坐标排一次)。那么可以将条件转化一下,在珠宝按x坐标排好序时,x坐标大于等于aia_iai的最多取bib_ibi个可以转化为取的前k−bik-b_ik−bi个珠宝的x坐标要小于aia_iai。同理,x坐标小于等于aia_iai的最多可以取bib_ibi个可以转化为取的后k−bik-b_ik−bi个珠宝的x坐标要大于aia_iai。y坐标同理。那么这样的话,就可以计算出取的每个珠宝的x,y坐标取值范围。接下转载 2021-01-29 22:09:27 · 137 阅读 · 0 评论 -
计蒜客 91 地铁 & HDU 5263 平衡大师(二分+网络流)
先说PPT的思路PPT的思路源于这句话:对每条边 (u, v),连一条 (u, v) 容量为 1,费用为 1 的边。如果流了表示删去这条边。流过原图上的边表示删去这条边意味着什么呢?令dif[u]=u的出度-入度如图,灰边表示原图上的边,初始状态没有流过任何边因为原图没有边被删,所以dif[u]=-1这时,如果有一流量为1的流流过边a,那么此流只能从u在原图上的出边流出,即有一流量为1的流流过了边2,代表原图中边2被删,dif[u]=dif[u]-1=-2因此,s到u流一流量为Δx的流,原创 2021-01-29 21:37:48 · 212 阅读 · 0 评论 -
hihocoder1147 时空阵(bfs树+DP)
设f[i][j][k]f[i][j][k]f[i][j][k]为前iii层一共使用jjj个节点,其中第iii层有kkk个节点的合法方案,nnn在第LLL层i=0:i=0:i=0:f[0][1][1]=1f[0][1][1]=1f[0][1][1]=10<i<L:0<i<L:0<i<L:f[i][j][k]=∑f[i−1][j−k][x]×(2x−1)k×2Ck2×Cn−(j−k)−1kf[i][j][k]=\sum f[i-1][j-k][x]\times(2^x转载 2021-01-29 09:27:03 · 85 阅读 · 0 评论 -
CF449B Jzzhu and Cities(Dijkstra)
设每个点到1的距离为dis[x],特殊边为(1,v_i,w_i)1、w_i>dis[v_i]的特殊边可以删除2、w_i=dis[v_i]且num[v_i]>1,特殊边可以删掉思路上的偏差:num[v_i]=到v_i的最短路的数量实际:num[v_i]=从v_i出发有几条边可作为最短路的一部分错因:显然,删除①对是否删除②没有影响...原创 2021-01-25 09:52:34 · 183 阅读 · 0 评论 -
[NOI2019] 序列(模拟费用流)
原先自己想的建图:正确建图:原创 2020-06-13 08:15:52 · 118 阅读 · 0 评论 -
【BZOJ3218】a+b problem (最小割 + 主席树)
#include<bits/stdc++.h>using namespace std;const int inf=1000000007;const int N=200010;const int M=1000010; struct Edge{ int u,v,f,next;}edge[M];int head[N],cnt;int s,t,flow,level[N]; struct Node{ int x,id;}e[5010];int L[5010],R.原创 2020-06-05 21:22:52 · 159 阅读 · 0 评论 -
Tarjan
有向图的强连通分量:因为是复习,所以在此不进行算法赘述算法介绍:https://www.cnblogs.com/mhpp/p/6751723.html#include<iostream>#include<vector>#include<stack>using namespace std;vector<int> g[1001];sta...原创 2019-06-03 21:38:38 · 468 阅读 · 0 评论 -
网络流小结
最大流:EK算法:#include<iostream>#include<queue>#include<cstring>using namespace std;const int inf=0x7fffffff;int n,k,d,g[500][500],pre[500],tot;bool vis[500];bool bfs(int s,int t...原创 2019-06-03 21:35:06 · 227 阅读 · 0 评论