
图论
文章平均质量分 63
sophilex
Every day,Every moment
展开
-
【学习笔记】 LGV引理
虽然但是,我们的终点是不确定的,所以直接枚举每一个起点对应的终点然后再算行列式的话,是不行的。,n秒钟,每一秒对于每一个点来说,有一半概率保持不动,有一半的概率前进1个单位,求k个点两两碰撞的概率。对于左式,我们实际上是要算逆序对个数为偶数的所有置换对应的方案数减去逆序对个数为奇数的方案数。是一个偶数,就意味着加入i不会改变当前序列逆序对数的奇偶性,所以直接加就好了,否则要取负。),此时右式只有一个因子,含义就是整张图的不相交路径组数,就可以用左式的行列式表示了。,这样就相当于求k条不相交路径的方案数了。原创 2023-09-25 19:18:03 · 607 阅读 · 0 评论 -
【学习笔记】Prufer序列
起源于对Cayley定理的证明,但是其功能远不止于此原创 2023-09-22 20:22:51 · 713 阅读 · 0 评论 -
逆天思维题 CF741C
我们会发现,每一个点都被两种边连接,一个来自它的伴侣,一个来自它的其中一个相邻点,所以最后如果有环的话,一定是两种边交替出现的,所以不可能有奇环(一个特殊情况是情侣相邻坐,但不难发现此时也不是奇环)。有2n个人围成一圈坐在桌子边上,每个人占据一个位子,对应这2n个人是n对情侣,要求情侣不能吃同一种食物,并且桌子上相邻的三个人的食物必须有两个人是不同的,只有两种食物(1或者是2),问一种可行分配方式。因为只有两种颜色,所以是要我们构造一张二分图,其中情侣之间要连边,关键就是如何处理任意三个点之间的关系。原创 2023-04-06 21:40:29 · 317 阅读 · 0 评论 -
AtCoder Beginner Contest 289 题解
更进一步,在不改变横坐标的情况下,如果连续两次选择的点的纵坐标相差=1,那么最后的实际效果是纵坐标变化=2,这是改变的最小差值。一张简单图,每一个点有一个颜色(1或0),两个点从分别从1和n出发,同时走下一步,且两者下一步的颜色必须不同,问能否实现分别到达n和1.如果可以,求最小步数。因为如果我们只改变纵坐标的话,第一次选(a,c),第二次选(a,c+1),可以发现横坐标会回到原位。规则如下,每次在一个选定区域内选择一个坐标均为整数的点C,移动到关于点C对称的点。初始状态是(1,n),最终状态是(n,1)原创 2023-02-12 11:01:29 · 1135 阅读 · 0 评论 -
树的直径(板子)
用树形dp来求贴个板子自己用~对应板子题#include<bits/stdc++.h>using namespace std;#define ll long longconst ll N=1e5+10;const ll mod=1e9+7;struct ty{ ll l,t,next;}edge[N<<1];ll cnt=0;ll head[N];ll f1[N],f2[N];ll n,a,b,c;void add(ll a,ll b,ll c)原创 2022-04-08 21:09:40 · 410 阅读 · 0 评论 -
AtCoder Beginner Contest 280 老年人复建赛
这里,如果A到B有两条路径,且一条的权值为a,另一条的权值为b的话,如果a!=b,那么会发生什么?这就意味着a-b不为0,所以这两条路径产生的环,从某一个方向走的话,总权值就是正的了,那么我们就可以一直走来刷分,那么结果就是inf,考虑到连通块上的其他点也能从环上任意一点到达,所以这整个连通块上的点的答案就都是inf了。如此我们得到一个结论:从A到B的答案不为inf当且仅当A到B的所有路径的总权值都是相等的,这就是说这里不存在dis更新的问题,因为能更新就意味着inf,这个我们可以在最后直接判掉。这原创 2022-12-04 09:53:43 · 553 阅读 · 0 评论 -
trie树+思维 Xor-MST
既然如此,那么任意两个数字之间的异或值就是它们到根节点路径上的对应节点的异或值的累加,那么我们就不难发现,trie树上两个叶子节点的lca深度越深,它们的异或结果也就越小。我的一开始的思路其实是ok的,就是trie,毕竟关于异或的题,很多都可以跟trie扯上关系。另外,如果我们将数字按顺序插入trie树中,那么每一个节点对应的范围也就是原序列里一段连续的区间了,那么我们就可以很轻松地每次去查找两个子树合并的最小代价了,只要遍历左子树对应的数字,然后在右子树里找到它的最小异或值就好了。当然反一下也是可以的。原创 2022-11-14 16:21:15 · 262 阅读 · 0 评论 -
2021年巴西icpc重现赛补题
所以首先用树上倍增找到初始点到根的路径上的满足权值要求的深度最浅的点RT,那么不难发现能被加入该集合的所有点一定都在RT的子树内,否则,其与RT的lca就会是一个深度更浅的点,但RT已经是能找到的深度最浅的点了,所以矛盾。稍微转化以下题意,不难发现,对于每一个区间以及其初始点,我们其实就是要找一个包含该初始点的连通块,其中连通块内的每一个点的权值都在该区间内,然后里面的每一个点的答案就可以+1了。首先连通块内的点的权值都是满足条件的,并且它们与初始点的路径上的每一个点都被加入了集合,所以A原创 2022-10-08 21:20:23 · 394 阅读 · 0 评论 -
trie树(零)零基础入门
规定每一层的节点是与其直接相连的下一层的节点的父亲节点,相对应的,每一层节点是与其直接相连的上一层节点的儿子节点,特殊地,根节点没有父亲节点。而对于没有儿子节点的节点,我们叫它叶子节点。基于一组预定义的模式构建一个集合,然后,将输入的字符串与该集合内部的字符串进行前缀匹配,进而不断缩小可选范围,在可选范围内将可行字符串输出,进而通过接受状态来显示文本,实现自动补全的功能。按照之前讲述的关于树的定义,我们不难发现,字典中每一位对应的26个英文字母与上一位的某一个英文字母都是多对一,也就是树的关系。原创 2022-09-28 14:29:11 · 222 阅读 · 0 评论 -
树链剖分入门指南
很多情况下我们需要在树上处理一些路径问题,比如叶子到根节点的路径最大子段和之类的,有时候还要加入修改操作,这时候树剖就是一个非常强有力的武器。对于每一个节点a,定义重儿子为其儿子节点中对应子树最大的儿子,重链为以a为起点的一条链,链中的每一个节点都是一个相应节点的重儿子。如图,红色为重儿子,蓝色路径为重链(还是很好理解的)当然,对于叶子节点来说,它自己本身就是一条重链。原创 2022-09-07 16:48:36 · 248 阅读 · 0 评论 -
树链剖分 边权下放点权
首先,对于一条边,它有两个顶点,那么肯定是让深度较浅的点,也就是父节点的点权来作为这条边的边权。然后最后我们要查边权的时候,只要查它对应的子节点就可以了。2.树上路径更新的时候,你稍微手玩一下就会发现两个节点的lca是不应该被更新的,所以在最后一步更新的时候,我们的代码要有所改变。3.查询树上路径权值和时(如果有这个操作),同理两点的lca的点权不应该被算进去,因为它对应的边不属于这两点的路径上。同理,你也可以这么写,意思我就不解释了。其实就是把lca的更新的结果给改回去。就那么些操作,没有大意。原创 2022-08-19 22:02:46 · 263 阅读 · 0 评论 -
trie树(二)进阶
有一个点要注意,就是当你发现当前已经到达某一个字符串的结尾时,ans++,但是不能直接return,因为有可能其它字符串的起点刚好就是这个字符串的结尾,所以这时我们应该继续dfs下去,而不是返回。2.并且对于所有与它有相同前缀的字符串,该字符串的下一个字母的字典序也一定是比另一个字符串的下一个字母的字典序要小。3.另外,如果如果有一个字符串是它的前缀,那么这个前缀一定会比它有更小的字典序,所以这种情况下该字符串就是失败的。1.某个字符串能够作为字典序最小的字符串,那么它的首字母一定是最小的。...原创 2022-08-13 10:51:03 · 184 阅读 · 0 评论 -
trie树(一)01trie
trie树是个好东西,而它有一类专门的应用,是用来处理区间异或的问题的,考虑到异或操作中我们只关心0/1,因此01tire也就是一种每一个节点最多只有两个儿子的树,具体操作其实跟普通trie树差不多,具体看例题吧。我们发现,对于一个数的二进制表示,最高位对结果的贡献是大于之前所有位的贡献之和的,所以,如果我们从高到低遍历每一位时,只要当前这一位能满足异或后得到1,我们就一定取这个值。对于给定的s,我们考虑它的二进制表示,现在就是要尽可能使得它的每一个非1位都有一个0对应。......原创 2022-08-11 14:59:41 · 2335 阅读 · 4 评论 -
树形dp CF461B Appleman and Tree
我们会发现一个合法状态(联通块内有且只有一个黑点)可以由两个合法状态切割而成,也可以由一个合法状态与一个非法状态(没有黑点)合并而成。所以我们可以设dp[i][j]表示以i为子树的根,满足i所在的连通块由一个黑点的方案数(dp[i][1]),和满足i所在的连通块由没有黑点的方案数(dp[i][0]).至于多个黑点的情况,则可以由该dp式分割转移。不妨先考虑dp[i]表示以i为根的子树,满足条件的删边方法数。考虑初始化:dp[i][color[i]]=1;给你一棵有 n 个节点的树,下标从 0 开始。...原创 2022-08-04 13:58:14 · 153 阅读 · 0 评论 -
树形dp小总结(换根,基环树,杂七杂八的dp)
脑子是个好东西,可惜我有的不多。。。从小到大都是看见树就头皮发麻,前阵子学的多了稍微好一点,但是经过一个树专题的洗礼,熟悉的恐惧感又回来了。。。会讲一下换根dp,基环树dp,也许后面还会更一下树上背包之类的换根换根,就是对不同节点做根的情况进行讨论,通常就是在一些节点选择的题目里会出现,但是碰到的不多(lwh简单的不会考,难的,你们。。。.....................原创 2022-07-28 20:32:05 · 643 阅读 · 0 评论 -
[COCI2012-2013] POPUST
COCI大意:问能否确定1-n的一个排列满足所有条件思路:按题意确定每一个点和每一个位置对应的范围大小,如果能够找到一个满足条件的排列,也就意味着点与位置的约束不会互相矛盾,且能够一一匹配,所以跑一个匈牙利就可以了。(其实赛时也有想过这个,但是经验太少,还是不知道怎么建图。。。)确定numr,numl数组,表示每一个数字能放置的最远和最近的区间再确定qr,ql数组,表示每一个位置能放的最大的数和最小的数 然后按关系建边即可...原创 2022-07-12 19:44:13 · 181 阅读 · 0 评论 -
AtCoder Beginner Contest 237 VP补题
E大意:给定一张无向图,两点间的边权:较高点到较低点的边权等于高度差较低点到较高点的边权等于高度差的负二倍求:图中的最大dis值思路:按题意建边即可;但是有负权,所以一般的dij不行。赛后又加强过数据,所以我跑了spfa,T烂了。。。(但是我看有一个哥们还真用spfa冲过去了。。。【崩溃】)官方题解的思路是dij考虑“势”的思想(绝):对数据进行预处理,高点到低点的边权等于0,低点到高点的距离等于高度差(>=0)那么就全是非负权边了。跑完dij后只要把数据还原回去就可以了,dis[i]=h[i]-h[1原创 2022-07-02 10:26:28 · 162 阅读 · 0 评论 -
AtCoder Beginner Contest 252(dijkstra,逆向思维)
E - Road Reduction大意:给定一张简单无向图。求任意一颗生成树,使得从点1到其他所有点的距离之和最小思路:在生成树中,1到任意点的距离肯定大于等于原图中1到该点的距离。所以,如果两个距离相等,那就是最优解。换句话说,对于每一个点,找到能使他到1点距离最小的边都应该是保留的。如果再仔细想一想,就会发现在这一条路径上的所有点,它们对应的也应该是原图中的最短路径。那么就很简单了,跑一遍dijkstra,对每一个点的dis值被更新时,记录对应的边的id,最后遍历输出即可。因为每一个点被更新时对应原创 2022-06-20 15:36:41 · 389 阅读 · 0 评论 -
AtCoder Regular Contest 142
A题不用说,C题之后不会。。。B - Unbalanced Squares大意:构造一个n阶矩阵(元素从1~n^2),对于矩阵中的每一个元素,它周围的元素中大于它的数目和小于它的数目不能相等。思路:想了二十多分钟才有的思路。。。脑子是越来越不行了。我的思路:如果直接按从小到大的顺序做矩阵的话:1 2 3 45 6 7 89 10 11 1213 14 15 16很明显是不行的。但是仔细观察一下,如果对每一行的元素改变一下顺序的话,可能是有希望的(总比全部重新构造好)。第一行和最后一行的每一个元素都是满足条原创 2022-06-20 12:49:13 · 366 阅读 · 0 评论 -
【总结向】个人赛补题 POJ - 3041 Asteroids &CodeForces - 173B Chamber of Secrets
urlPOJ - 3041 Asteroids大意:N×N (1≤N≤500) 的网格,其中有 K (1≤K≤10000) 颗小行星。每次能够发射一道光束,将某行或者某列上的所有小行星轰成灰烬。希望发射的光束数量尽可能少。问发射的光束最少数量是多少?思路:没想到时那么那么那么裸的二分图匹配。。。一直没有想到将每一个点的列和行作为二部图的两个顶点。如果想到了这个的话,那其实就是要求一个图的最小覆盖,也就是最大匹配了。然后匈牙利算法套板子即可。(有匈牙利谁还要写dinic。。原创 2022-05-29 20:18:41 · 121 阅读 · 0 评论 -
网络流/最小割点集 [USACO5.4]奶牛的电信
最小割点集大意:给定一张图,求其最小割点集的大小思路:蒟蒻如我,看到题目直接嗷嗷大叫:“卧槽是裸的最小割边!这题我会做!”兴冲冲敲完dinic莽一发80分。。。做题从不带眼睛。。。(思路都错了居然也还有80分。。。)那这个题是要求最小割点,所以我们不妨想想看怎么把它转化为普通的最大流问题。一个很精妙的思路是拆点。把一个点A拆成A和A',两者有一条单向边AA',权值为1,为了构造网络流我们就会让其反向边权值为0.那么当我们要拆点是,实质上就是把这条权值为1的边去了,也原创 2022-05-18 17:28:49 · 163 阅读 · 0 评论 -
二分图染色/最大二分图匹配方法总结
先给出二分图的定义:一张图 G 是二分图当且仅当 G 的点集 V 可以分为两个点集 V0,V1,满足 V0∪V1=V,V0∩V1=∅,且对于 G 的每条边 e,其两个端点分别属于不同的点集。简单来说,一张图是二分图,当且仅当它的点可以被分成两部分,而这张图上的所有边的两个端点,都属于两个不同的部分。那么如何判断一张图是不是二分图呢?注意到每一条边的两个顶点都属于两个不同的集合,所以我们可以从任意一个点开始,将与其直接相连的点染成相反的颜色,用来代表两个不同的集合,并对其它点重复此原创 2022-05-17 20:02:04 · 267 阅读 · 0 评论 -
网络流总结
相比于上面算法的O(nm^2)(n为点数,m为边数),Dinic可以达到O(n^2m),在稠密图上(比如二分匹配之类的)Dinic的优势就非常明显了。(Dinic在跑二分图匹配时比匈牙利快很多。)下面这个为加了当前弧优化的版本原创 2022-05-17 17:40:40 · 146 阅读 · 0 评论 -
CF1336A Linova and Kingdom
看这里大意:有一个有 n 个点的树,以 1 为根,你可以选择 k 个节点,使得这 k 个节点到 1 节点的最短路径中经过的非选择的点最多。思路:简单树形dp我们肯定会优先最好的叶子结点,这个能保证中间路径最长,相同路径下选叶子节点比选非叶子节点一定是要优的。所以如果我们选了一个非叶子节点,代表它的所有儿子我们肯定都选过了,那么就得把对应的重复贡献减掉。这样一综合就得到了对应的公式:每一个点选上之后对答案的贡献应该是它的深度减去以它为根的子树的大小。这里要求每一个点的深度以及子.原创 2022-05-10 13:07:26 · 139 阅读 · 0 评论 -
AtCoder Beginner Contest 243E Edge Deletion
题目链接大意:给定一张图,统计可删的边的总数,一条边当且仅当其对图的联通性和任意两点的最短路无影响时可以被删去。思路:大概会去往flyod方向上靠,因为这肯定是要求多源最短路的。大部分情况应该都是ok的,只要先建完一张最短路图,然后对于每一条边,只要它大于对应两条边的最短路,那么它就一定可以被删去。但是还有一个问题,就是当这条边的权值和其对应两点的最短路一样长时,得分为两种情况1:最短路就是这条边自身,那么它肯定是不能删的。2.它对构成另一条最短路无贡献,那么它就是可以删的。原创 2022-03-16 20:28:55 · 341 阅读 · 0 评论 -
[JSOI2008]最大数MAXNUMBER
ST表/线段树大意:m次操作1.查询后l个数当中的最大值2.上一次查询的结果加上指定数并取模加到数组的后面思路:ST表 裸的。f[i][j]查询i后面2^j个数中的最大值数组动态更新。线段树:改一下板子,把查询最后l个数的最大值改为查询【n-l+1,n】的区间最大值。注意数组开够即可。ST表code:#include<bits/stdc++.h>using namespace std;#define ll long longconst ll N原创 2022-03-04 18:29:38 · 210 阅读 · 0 评论 -
flody传递闭包
一般是会给出一些胜负关系,然后我们就可以通过flody来传递这种胜负关系。比如3>2,2>0,所以我们就可以得到3>0。但是因为flody的时空间复杂度都比较高,所以我们有时候可能还得加一些优化。牛牛比赛大意:已知一些胜负关系,试求出能确定排名的牛的个数思路:可以用一个bitset优化邻接矩阵,如果两只牛有关系,让胜者到负者的距离变成1.然后跑一遍flody,最后遍历时只要统计一下每只牛是否对其他n-1只牛的关系都已知即可。数据量就100,随便怎么搞。原创 2022-03-02 16:15:47 · 122 阅读 · 0 评论 -
图论-分层图
分层图常见于一些有多种限制,情况比较复杂的题目中做法一般有两种第一个是运用了分层的思想,但会以dp的形式来实现,加入松弛的思想,不断更新满足条件的边权并通过SPFA或某k算法来求最短路进而得出答案。牛客 追债之旅大意:给定一张图,要在k步内从起点走到指定位置,并且每一步的时间会增加一定的权值,求最小的权值和。思路:约束条件有每一步的权值和每一条路的对应的权值以及步数的要求。可以用dp【i】【j]来表示第i天走到第j个点的最小权值和。那么对应的松弛操作就应该是.原创 2022-03-01 18:20:56 · 1034 阅读 · 1 评论 -
UCF Local Contest A Prickly Problem
大意:给定一个图(边权全部=1),求生成树个数(点数<=100)思路:生成树计数裸题。1.基尔霍夫矩阵套板子ll K[N][N];ll f(){ for(int i=1;i<=n-1;i++){ for(int j=i+1;j<=n-1;j++){ while(K[j][i]){//辗转相除 ll t=K[i][i]/K[j][i]; f...原创 2022-02-27 09:38:07 · 256 阅读 · 0 评论 -
求树的直径 模板
树的直径:树上最远两点的距离求直径方法:先在任意一点做dfs找到离它最远的一个点作为直径的其中一个端点再以这个端点再做一次dfs找到另一个端点。两个端点的距离就是树的直径。一般可能会需要求出每一个点关于两个端点的距离,那就在每次dfs时注意一下相关数组即可例题大意:给定一棵树,要求构造n-1条边,使得每两个点的距离唯一且尽可能大。求边权之和。思路:找到直径的两个端点,树上离每一个点最远的点一定是两个直径之一,遍历每一个点时取到两个端点的距离的最大值即可。#inc原创 2022-02-25 15:55:51 · 162 阅读 · 0 评论 -
AtCoder Beginner Contest 240 E - Ranges on Tree
abc 240 E大意:给你一棵树,已知根节点为1.令Si表示以节点i为根的子树每一个节点会有两个数l,r(l<=r),所有数的构建应当满足现在求一种构建方式,使所出现的数尽可能小。输出每一个点对应的l,r思路:对于每一个叶节点,要让总的数尽可能小,那么叶节点的l=r自然是最优的。我们一次dfs找出所有叶节点并计数,每一个叶节点的l,r就是它对应的计数编号。然后再来一次dfs从根往下递归,每一个根节点的l应该使它的所有叶节点的l的最小值,相应的,根节点的r就应该原创 2022-02-21 10:16:16 · 431 阅读 · 0 评论 -
无向图中flyod求最小环
先将ab的边权设置为正无穷,然后跑一遍单源最短路,再恢复原本断掉的那条边,那么二者之和显然就是对于ab而言的最小环的长度了,然后每次更新即可;复杂度应该是O(n^2*E),E是边数。另一种就是Flyod的应用了,话说Flyod好像用处特别多。(包括用bool型来求闭包的)与上一种思路其实差不多,但是我们引进了一个中转点k,因为对于一个环来说,它至少是由三个点构成的,所以引进一个点是合理的。原创 2022-01-16 12:19:05 · 715 阅读 · 1 评论