今天想来点图论吗?
学oi以来就没认真学过图论/ll,%wkl
差分约束
- 有个变量,有个关于这些变量的关系式,问在满足限制的情况下,最大是多少
首先不等式个数有限,所以不可能把每个变量的值都解出来的
先强制
考虑最短路有三角不等式(最长路三角不等式变号)
考虑不等式 ---->
于是我们考虑用代表,这样的话一个最短路就一定满足不等式关系,且求出的是最大
最大值用最短路,最小值用最长路
problem 3
给定𝑁 × 𝑁的矩阵
• 每次可以将某一行或者某一列随便乘以一个数(可以是小数)
• 问能否使得所有数的都在[𝑙, 𝑟]之间
将行列拆成点, 限制转换为
于是就可以差分约束判负环了
(copy from <21qbxt赛前互测>)
二分图
- 最小点覆盖 : 选出若干个点,对于任意一条边(u,v)满足至少有一个点存在于集合之中最小点覆盖=最大匹配
- 最大独立集 : 选出若干个点,对于任意一条边(u,v)满足至多有一个点存在于集合之中,即点两两之间不相邻,显然最大独立集与最小点覆盖是互补的最大独立集=点数-最小点覆盖
- 最大团 : 选出若干个点,使得这些点之间两两直接相连,易证最大团=补图最大独立集
- DAG最小路径覆盖 : 选出若干条路径,每个点只存在于一个路径之中(即路径不交),考虑将原图拆点,变成二分图,给每个点找上家,相当于路径合并,答案为 原图点数-二分图最大匹配
- DAG最小链覆盖 : 选出若干条链,这些链可交,考虑先求出DAG的传递闭包,将联通的任意两点之间连边,然后对于新图跑一遍最小路径覆盖即可
- DAG最长反链 选出若干个点,使得这些点两两不可到达,有 最长反链=最小路径覆盖
判断二分图:黑白染色,奇环,拆点并查集
这些等式均在二分图的情况下才满足,大部分参考自博客,Orz
欧拉路径不可能学的,这辈子都不会学的,当然这个巨坑待填
upd on 2022.2.7 终于会了
消除格子
有一个n*m的矩阵,有些格子上有障碍,要求我们消除这些障碍,每次可以消除一行或一列的所有障碍,最小操作次数?
考虑将行列看成点,对于一行x操作则将(x,y1)(x,y2)...的所有点cover掉,考虑对于每个点将x和y连边,每次对于行列操作相当于点覆盖,直接跑最小点覆盖即可
攻击装置
一个马能攻击到8个位置,问一个n*m的矩阵上最多能放多少马,使得这些马直接不能互相攻击到
将矩阵黑白染色,考虑将每个点向这8个点连边,构成了一张二分图,于是我们直接跑最大独立集即可,当然也可以用最小割来做
CF962F
考虑求出每个bcc,每个桥一定不存在答案中,于是可以对每个bcc分别考虑
考虑bcc的定义,对于一条边(u,v)一定存在至少一个简单环包含这条边,于是判断每个bcc是不是只有一个环即可
BZOJ2959
引理:对于一个bcc,存在一种定向方案,使得每个点能到该bcc的任意一点且能经过所有点
考虑将bcc缩成一个点,则原图变成了一棵树,直接用lct维护即可
但是有一种情况,假如要连的边(x,y)本来联通,则要把它们缩成一个点,考虑将这条路径spilt一下,再用并查集一下就行了
圆方树
对每个BCC单独建一个点
性质:
1.相邻的两个点类型一定不同,即圆点只能和方点相邻,方点只能和圆点相邻。
2.一个点到另一个点的所有路径的交集为在圆方树上这两个点的路径上所有的圆点。
3.一个点到另一个点的所有简单路径的并集为在圆方树上这两个点的路径上所有的方点表示的点双内的点的并集。
2性质可以用到比如:要去掉一些点,使得两点之间不连通
3性质可以用到比如:两点之间所有路径有哪些点,这样可以用BCC表示出来
loj2562
考虑建出圆方树,如果删除的一个点在一对点的路径上则这个点就可以删掉,于是我们直接统计虚树上的圆点个数即可
三四元环
考虑将边定向,对一条无向边,将度数小的连向度数大的,度数一样的话直接编号小的连向编号大的,证明考虑根号分治,模板
三元环的话就可以直接枚举大力枚举了,且不会算重,因为边有向,复杂度,q
每个点的出度是级别的,先标价一下a的出边的每一个点就行了
四元环的话就要认真讨论一下四个点的大小关系了,于是我们考虑每个四元环我们只记录度数最小的哪个点带来的贡献,于是我们直接枚举这个点a,考虑四元环的形状,一定是由两条路径组成的,于是我们只用统计一条路径即可,于是我们直接枚举这条路径,对每个点维护个cnt,每次累加增量即可,复杂度,因为一条无向边只会被统计次,我们不需要管b,c,d的大小关系
简单题
https://noip.ac/rs/show_problem/3506
考虑每个关卡向比这个关卡弱的点连边,答案显然为一个DAG上的最小权路径覆盖,一个路径的权为首的权值
先将所有点的权加上,拆完点后直接跑MCMF,出点向汇点连负权值,每次流过一个流量,相当于给一个点找到了上家,将这个点的权值退回即可,ans=sum-MCMF()
还可以这么做,拆点记为(i1,i2)连(S,i1,1,-aidi)(i2,T,1,aidi),如果j能通向i,连(i1,j2,1,0),显然必须满流,因为所有点都要被覆盖
欧拉回路
充要条件:有向图所有点入度=出度,无向图每个点度数都是偶数
求出来的的话考虑爆搜,每次尽可能找出边dfs,如果不能dfs下去的话考虑将这个点return,并将和上一个点的边加入栈中,直到回退到了一个点有出边可走,最后出栈的顺序即为我们的欧拉回路
BZOJ3417
奇偶最短路,考虑分层,一条边跨层连边,对每个点bfs求出最短路即可
P2865
次短路,跑两次spfa,考虑一个点的次短路,只可能从四周的点的最短路或次短路更新过来
lamp
考虑一条边代表限制,边权代表代价,01最短路,用bfs+双端队列实现
BZOJ 3245
巧妙的分层,按速度分层,这样就确定了到每个点的时的速度
分层图我的理解就是,需要在基本的图上,满足一些限制和条件,直接对这些限制和条件分层,一条边的限制改变就在层之间连边
连边满足限制,图论求最优解
BZOJ 3389
考虑一种建图方式,先将区间左闭右开,将l到r连边(val:1),i到i-1连边(val:0),求一下最短路就行了
墨墨的等式
这个题就不能往裴蜀定理的方向去想了,同余最短路
考虑直接在值上考虑,如果一个数能被凑出来,则都能被凑出来
于是我们考虑在对于每个x,找到这样最小的k
我们在模的值域下考虑,对于每个数x,向连边,边权为
BZOJ 4152
考虑3个点,跨过两个点的边可以不连
考虑将所有点先投射到x轴上再投射到y轴上,相邻点之间连边即可
BZOJ 1641
- n个点m条有向带权边的稠密图,有 T 个查询,第 查询的起点和终点为 询问路径上的最大值最小是多少
代表 到 的路径最大值最小是多少
POJ 3613
- n点m边的无向联通带权图,且稠密,求 到 经过恰好 条边的最短路径长度
代表 到 经过恰好 条边的最短路径长度
这个东西满足结合律,且 就是原图的邻接矩阵,转移与矩阵乘法很类似,稍微魔改一下就可以了
矩阵快速幂,处理
BZOJ 4773
- 对于一个带权有向图 , 请找出一个点数最小的负环,无重边无自环
floyd,限制走的步数为小于等于,处理走小于等于步后的最短路矩阵,判断 是否小于0
倍增求可以做到
P1119 灾后重建
- n个点m条无向带权边的图,每个点i从 之后才能被经过
将询问离线,按 排序,暴力加边,更新到该点的最短路,每次以该点为中间点更新最短路,
BZOJ 3714
区间左闭右开,能猜出的充要条件是必须这些区间联通n+1个点
以为知道了[a,b),[b,c)就知道了[a,c)
于是我们要知道[i,i+1)的值必须满足i和i+1联通,推广到n+1个点即可
于是求一颗MST即可
BZOJ4144
一个性质,从当前节点到距离他最近的加油站再去往其他加油站不会更差,于是我们可以通过这个思路先求出每个点的最近加油站即距离再说
这样的话我们只可以得到一次询问的做法
考虑到答案只和加油站有关系,于是考虑对一条边(u,v),u和v的最近加油站不同,我们可以连一条dis[u]+dis[v]+w的边,最后在加油站之间跑MST,LCA查即可
BZOJ 2654
二分惩罚值
poj3498
一堆企鹅要碰面,现在有N块冰块,第i个冰块坐标为(xi,yi),上面有企鹅ni个,能承受企鹅在上面起跳mi次,并且知道企鹅最大跳距离为d。你要帮助企鹅找到所有可能的聚集地点。
冰块 1 ≤ N ≤ 100
0 ≤ ni ≤ 10, 1 ≤ mi ≤ 200
拆点+最大流
POJ 1149
有 M 个猪圈,每个猪圈里初始时有若干头猪。开始所有猪圈都是关闭的。依次来了 N 个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头猪。每个顾客分别都有他能够买的数量的上限。每个顾客走后,他打开的那些猪圈中的猪,都可以被任意地调换到其它开着的猪圈里,然后所有猪圈重新关上。 问总共最多能卖出多少头猪。
M ≤ 1000
N ≤ 100
考虑用一个流量来表示一个猪的命运
按照时间分层,直接建图边太多了,考虑优化
其实完全可以建个中转点来避免这种情况
SGU 326
NBA 某小组内有 N 支球队,小组内以及小组间已经进行了若干场比赛。现在给出这 N 支球队目前胜利的场数、还剩多少场没有比(包括小组内和小组间)以及小组内任意两支球队之间还剩多少场没有比,存在maze[i][j]中, 问能否合理安排剩下的所有比赛,使得球队 1 最后胜利的场数至少大于等于小组内任何一支其他球队。
2 ≤ N ≤ 20
0 ≤其他任何输入≤ 10000
将每场比赛看成点,一场比赛要不是A赢要不是B赢,看看是不是满流就可以了
Poj3281
有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料。现在有N头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢的食物和饮料。
1 ≤ F ≤ 100
1 ≤ D ≤ 100
1 ≤ N ≤ 100
将牛放在中间,两边连即可
POJ 2699
一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边(u, v)或( v, u),表示u打败v或v打败u。一个选手的得分等于被他打败的选手总数。一个选手被称为“strong king”当且仅当他打败了所有比他分高的选手。分数最高的选手也是strong king。现在给出某场联赛所有选手的得分序列,由低到高,问合理安排每场比赛的结果后最多能有几个strong king。已知选手总数不超过10个
对于一个从大到小的的分序列,如果存在k个的方案,则一定可以调整成前k个,因为后面比前面是严格不优的,满足单调性
SGU 438
m个人在一条宽度为w的河的南岸,现在要到对岸,已知河中有n块石头,每块石头同时只能容纳ci个人,每个人一次最远都只能跳不超过d的整数距离,每次跳跃耗时为1,所有人同时起跳,问m个人全部过河所要花费的最少时间。
0 <= N <= 50, 0 < M <= 50
0 <= d <= 1000, 0 < W <= 1000,
坐标:0 < Xi < 1000, 0 < Yi < W
0 <= Ci <= 1000
综合,分层图+拆点+二分+网络流
SPOJ 962
在一个无向图中,一个人要从A点赶往B点,之后再赶往C点,且要求中途不能多次经过同一个点。问是否存在这样的路线。
3 <= 点数 <= 30011
1 <= 边数 <= 50011
看起来不像网络流的网络流
对中间点考虑,拆点,源点像B连边,汇点向A,C连边
和牛那个题类似
HDU 5639
给出一个n个点m条边的无向图G,每次你可以选择一些边,从图中删掉。要求选出来的边构成的子图的每个连通块最多只有一个环。 问最少需要删几次才能把所有边都删掉。
1≤n≤2000
0≤m≤2000
发现每个连通块一定是个基环树,即每次操作都是个基环树森林
于是你发现了基环树她是n个点n个边的,于是你可以为每个边分配到一个点,然后将这个点的容+1,发现每次操作容最大的点不能超过1,于是你就可以二分出这个最大容(即操作次数),然后像输赢一样跑网络流即可
基本对于这样的瓶颈问题,都可以用二分来做
POJ 2396
现在有一个n*m的矩阵,知道每行每列的和,和各自内每个整数的取值范围。
求问这样的矩阵是否存在。
m <= 200
n <= 20
分为行点和列点以及坐标点
上下界网络流,考虑拆成Li和Ri-Li,Li必须满流
先有源改无源(源汇连inf),建立超级源点和汇点,接着就直接将源点和这条边的出点连边,入点与汇点连边(环流),跑完最大流后,删除这两个点,接着再残余网络上继续跑最大流(记得清除负权值)
最小割
通过割来表示一些含代价的矛盾信息
一个流量是一个代价
一定是全局的!全局的!全局的!
其实这样有很多限制的题都可以用图论来解决
P3227 [HNOI2013]切糕
经典模型,不必多说
构建出若干个互不相干的链,每个链上只能满足一个限制,并且要付出一定的代价,若干个链之间还存在着一段前缀和一段后缀共存要付出一些代价的限制,答案要求全局最优解,这就是我们的切糕模型
POJ 2987
一个公司要裁人,给出裁每个人都有个盈利或者损失,如果一个人的上司被裁那么他也将被裁,现给出上下级关系问怎样裁才能使得公司的收益最大,最大为多少?
0 < 人数 ≤ 5000
0 ≤ 关系 ≤ 60000
最大权闭合子图,负权转正权
ans=正权和-min_cut
如果将图优化的话直接删掉流量为0的边,就变成了一个类似二分图的形式
XXXX
给你一个m*n的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大。
m<=50,n<=50
前缀矛盾不能直接跑最小割,由于是二分图,考虑将边反向
黑白染色,二分图最大带权独立集
答案为点券和减去min_cut
TC14719
考虑一个点只会有三种状态,且每个都有一个代价,且一个限制ai<=aj,必须满足ai的状态<=aj的状态,于是我们考虑最小割
explain:由于这题我们只要确定了状态之间的相对位置,每个状态内部的相对位置对答案并没有影响,且一定存在一种拓扑序使得他合法,于是我们只关心每个点的状态
BZOJ 1001
网格图转对偶图(平面图)
跑一边最短路即可
还可以推广到最小割计数等内容
CodeVS 1043
设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例):
某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。
此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。
考虑拆点限流,加上一个流量跑MCMF即可
TC11236
0/1分数规划,
直接对每对(a,b)连(1,max-min)跑MCMF就行了
BZOJ 1070
将时间的式子拆开,a1,a1+a2,a1+a2+a3,考虑每个点会将后面所有贡献+上这个数
于是我们倒着做,考虑当前放倒数第i量车,连边的时候直接连i*aj即可
CF 1120D
对叶子序列做差分
对于控制区间[𝑙,𝑟]
在差分序列上对应𝑙,𝑟+1两个点
最小生成树即可
这篇博客确实认真写了,希望对你有所帮助呀
Ancient Magic Circle in Teyvat
https://codeforces.ml/gym/103470/problem/K
给定一个 n 个点的完全图,有 m 条边是红边,其它是蓝边,求红四元团减去蓝四元团的个数
考虑对蓝四元团大力容斥,发信k=6的项消掉了,于是只考虑k=0,1,2,3,,4,5条红边的答案即可,直接大力分讨,途中可能需要三四元环计数
Cross the Maze
https://codeforces.com/gym/103427/problem/D
当然可以二分暴力建图,但我们其实可以一层层加图,每次在残余网络上跑,易得复杂度为O(nabt)
Counter-manifestation
给定一个有向图,无自环无重边,求所有回路的交点。
n<=500000, m<=1000000
gugugu~
loj3272
考虑一维的问题,就是一个经典的贪心问题,最少用多少个点能覆盖掉所有区间,直接排序枚举右端点即可
考虑如果maxl<=minr或者maxu<=mind的话说明这些矩形在一维内有交集,则可以转化为另一维问题的贪心做法了
考虑minr<=maxl并且mind<=maxu的话,就直接抽屉原理,考虑调整法易证选的点一定在矩形的四条边上,于是枚举哪个点放在角上,递归判断即可
剩下gugugu~
铁人两项
对于一个点双中的两点,它们之间简单路径的并集,恰好完全等于这个点双。
即同一个点双中的两不同点 u,v 之间一定存在一条简单路径经过给定的在同一个点双内的另一点 w。
在一个BCC中,给定任意三个不同的点a,b,c,一定存在一条从a到c的,经过每个点至多一次的简单路径经过了b,可用最小割来证明
于是我们考虑圆方树,建树完了之后,发现三个点s,c,f和法,当且仅当c的方点在s,f所在方点的路径上(可用上面的来证),于是直接统计贡献即可
P4313 文理分科
考虑先将所有收益加上,对每个same新建一个点,向四周的点连边即可
CF1146G Zoning Restrictions
与上个题同理
BZOJ4766
矩阵树定理,考虑用高斯消元将基尔霍夫矩阵消成下三角即可
P4174 [NOI2006] 最大获利
最大权闭合子图板题
Vijos 1891
有3n 天,每天有一个权值Qi,要求选出一些日子使得选出的Qi总和尽量大,而且任意连续 n 天中, 最多选 k 天。
N <= 100
(可能不太会?)
upd on 2022.2.20 会了
考虑题目满足的不等式即可
具体解法在wkl课件上,想要的话也可以QQ私我/kel
P3980 [NOI2008] 志愿者招募
经典的时间轴上的网络流
(考虑题目限制,每天至少ai人工作改成每天至多inf-ai人不工作
于是一条流量流过了一条边(i,i+1,inf-ai,0)的边代表他这天不工作
对于一个人在[s,t]工作,可以连(s,t+1,inf,ci),这样的话一个人在时间轴上的状态就被刻画了出来,直接跑MCMF()即可
网络流只能多选1,如果特殊的话需要建边来引导她
对于网络流和最小割,先要大胆强制那些必选/一定,这样才会有很好的性质)
upd on 2022.2.20 get到了新方法
对于这种一流对多流的问题,可以根据网络流(费用流)性质
1.流量限制
2.流量平衡
3.最优化
就可以用看似不是网络流的题用网络流来解决
基本步骤是
1.列出题目不等式
2.加入辅助变量变为等式
3.等式间相减,保留第一个和最后一个等式
4.如果每个变量等式两边各出现一次,则可以根据流量平衡连出边
5.对于等式中的常量建立源点汇点
可以把等号看做点,变量看做边即可
类似的题目还有 P3358 最长k可重区间集问题
P4307 [JSOI2009]球队收益 / 球队预算
人类智慧
假设直接建的话,由于费用流只能流一个流量的费用,但我们每次决定每场胜负时两个点的支出都会改变,于是考虑先将所有点都输,则一个流量流到一个点时这个点的增量为由于c增,d减,于是增量是不断递增的,即她是一个凸函数,于是我们直接拆边,对于每个增量建重边,由于单增,可以引导网络流一个一个流
预处理预处理!
拆开放外层!
优化瓶颈!
不要对一个几乎没有问题的解法硬钢,因为可能这个解法的最后一个问题恰是这个解法不能做这个题的原因
想到一个算法不对不要直接弃掉,考虑这个算法的过程!
对于两头的东西,我们不妨假设一个成立
线段树优化建图
有三种连边方式:加一条边,u 到 [l, r] 都加一条边,[l, r] 到 u 都加一
条边。
操作 m 次,求加完边后 s 到 [1, n] 所有点的最短路。
n, m ≤ 1e5
板题,建两颗线段树跑即可
P4151 最大XOR和路径
考虑答案的形式一定是若干个环+一条链,因为环到链的路径会算两次,被抵消了
于是做法就非常显然了,我们考虑将每个环的异或值放入线性基,然后任取一条链,在线性基里查即可
找环的话可以在dfs树中找,记录一个到根的异或值即可
bonus
这个题的线段树分治版CF938G Shortest Path Queries
P2805 [NOI2009] 植物大战僵尸
最大权闭合子图(可以跑环)+拓扑排序去环+外向边
在网络流图上反向建边去环即外向点即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」