
图论
文章平均质量分 51
光球层上的黑子
是个菜狗
展开
-
HDU4253 k条黑边的最小生成树
题目链接https://acm.hdu.edu.cn/showproblem.php?pid=4253题意给出图,边分黑白两色,求使用k条黑边的最小生成树思路先贴论文http://www.doc88.com/p-916950232776.html二分+生成树。为每条黑边加权x,然后求出使用最少low条黑边和最多high条黑边的最小生成树。可以证明low到high是一个连续区间,这个low和high可以通过更改排序策略求出(同边权时优先黑/白边)。假如k落在这个区间中,那么使用k条黑边的生成树和原创 2021-07-28 20:12:48 · 445 阅读 · 0 评论 -
poj3622 二分 双端队列BFS
题意有向图,k条边免费,除此以外花费为最长边,问最小花费思路老题,之前做是分层图最短路裸题,看蓝书新学了个双端队列BFS,用一下。二分答案,所有比这个答案大的边权为1,否则为0,跑最短路看是否小于等于k即可验证。在0-1图上最短路,可以跑双端队列BFS,复杂度是线性的。具体做法类似于BFS,只不过是插入的时候,如果权0插头,否则插尾即可。教训/收获关于最短路的BFS,如果权全为1,可以直接跑BFS,懒得敲粘SPFA板子也行,复杂度线性,如果是01权,可以跑双端队列BFS,也是线性。如果是正权,原创 2021-07-16 16:34:56 · 175 阅读 · 0 评论 -
acwing 284 区间DP
题目链接https://www.acwing.com/problem/content/286/题意给出树的欧拉序,树的子树结点有序,问树的可能形态数思路显然区间DP。我们让dp[l][r]为l-r的方案数,可以确定初值为dp[i][i]=1, 答案为dp[1][n]。考虑状态转移。我们不能枚举分界点个数与分界处,这样复杂度就起飞了。假设我们要枚举一个分界点,两个区间分别对应多个子树,那么可能出现重复。为了避免重复,我们可以考虑第一个子树的分界点k。比如l—r是这段区间,那么第一个子树我们令其为原创 2021-07-08 22:50:58 · 149 阅读 · 0 评论 -
HDU 4635强连通分量
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4635题意给出一张无向简单图,问保持其简单图性质且不生成强连通图的前提下,可以加多少边。若已经强连通,答案为-1.思路易想到一加边策略,不断加边直到最终只划分为两个点集,两点集内强连通,两点集间只有单向边。设其较小的点集大小为x,易知此时边数为n*(n-1)-(n-x)*x。将这个数减去本来边的数量即为答案。显然(均值不等式)我们应令x最小化。我们求SCC并缩点,新图中所有入度为0或者出度为0的点可以作原创 2021-07-03 20:03:13 · 128 阅读 · 2 评论 -
P3916 scc缩点入门
题目链接https://www.luogu.com.cn/problem/P3916题意有向图,问每个点可达最大节点编号思路如果是树,那么直接树形DP但是是有向图,好吧一个做法是反向建图,从大到小做dfs,很讨巧的方法。这里说下缩点说来惭愧,学了tarjan那几件套都没怎么做过题,一眼没看出来。就是求强连通分量,然后缩点成dag,直接跑树形dp就行了。缩点的操作就是跑出scc数组后,重新建图(原图已经无所谓了),改成sc个点即可。重新建图拿数组存一下边就好了(或者你也可以混用邻接矩阵原创 2021-06-25 19:58:30 · 356 阅读 · 0 评论 -
cf 708C - Centroids 树的重心 思维 贪心
题目链接https://codeforces.com/problemset/problem/708/C题意给一棵树,你有一次删去任一边,加上任一边(必须维持树结构)的操作机会,问每个点是否可以经过(当然也可以不经过)操作成为重心。思路想复杂了先复习下重心,定义就是题中的,最大子树不超过N/2。重心最少一个,最多为相连两个,所有节点到重心距离和最小。我们考虑两个重心情况,对不是重心的任一点,我们可以断开重心间边,选择这个点和另一侧重心相连,显然全有解考虑单个重心情况,容易想到以下贪心做法:选择原创 2021-06-25 12:08:14 · 358 阅读 · 0 评论 -
CF gym102411E 多源BFS
题目链接https://codeforces.com/gym/102411/problem/E题意给出一棵树,树上一些点染色,问是否有点到所有染色点距离相等?思路多源->多源转化为单源->多源。我们可以看作是所有染色点连了个虚拟源点(代码里没有体现,但思路是这样的),把虚拟源点扔队列里bfs去。我们维护dep数组存放当前bfs深度,也就是到虚拟源点距离。cnt数组存放当前点’汇集’的染色点的数量vis数组存放是否在队里。我们在BFS过程中,一个点最多可以被找到n次,但因为是原创 2021-06-24 22:21:32 · 254 阅读 · 0 评论 -
CF280C 期望的可加性
题目链接https://codeforces.com/problemset/problem/280/C题意给出一有根树,每次等概率删除一个点和其子树,问删完期望步数思路期望是有可加性的,删掉所有节点的期望就是所有节点被删的期望的和。显然一个节点被删的花费是1,但是它能否贡献期望是有概率的,假设他的祖先节点比他先被删除,那么他是不可以产生贡献的,因此我们可以将他的期望看成是这样E(x)={1,x先于祖先被删除0,x后于祖先被删除E(x)=\left\{ \begin{ar原创 2021-06-24 12:15:02 · 457 阅读 · 0 评论 -
P3478 STA-Station 树形DP 换根法入门
题目链接https://www.luogu.com.cn/problem/P3478题意一颗无根树,找出一根,使其子树到他自己的结点深度和最大思路换根法入门。我们处理无根树时,一般都是需要寻找(指定)一个根节点作为切人点的,比如我们调用dfs常常就是dfs(1,-1)开始,转移是dfs(y,x),人为的设置了树根。但当题目涉及多个树根的操作时,我们如果还是指定树根,显然会出现漏算。这时就需要换根法了,换根法的大概操作流程就是拆分任务,两次扫描。首先扫描出给定一根的一些数据,之后再考虑换掉根时原创 2021-06-23 21:50:46 · 274 阅读 · 0 评论 -
cf 1520G To Go Or Not To Go? 思维,bfs
题目链接https://codeforces.com/contest/1520/problem/G题意给出网格,格子中有墙。向相邻无墙位置移动花费m,有的位置有权值w,这样的点是传送门,可以从一个传送门传到另一个传送门,花费w1+w2。问左上到右下花费。思路最开始以为是一个裸的最短路,通过技巧将O(n²)边降到O(n)即可。就是每个点向周围可移动连边,建立sp点,每个传送门向他连边权为w,跑最短路即可。正确性没问题,但会MLE(2e7的数组RE,再大一点就MLE,真是麻了)。观察发现,传送门最多原创 2021-05-11 21:40:06 · 489 阅读 · 1 评论 -
2021 MetaCamp 7-5 直径 树的直径,思维
题目链接NOTHING题意给出图的笛卡尔积定义:点集做笛卡尔积,比如我们用数字123代表点集V1,字母abc代表点集V2,那么新图的点集V就是二元组(1,a)(1,b)(1,c)(2,a)…的集合。假如1-2,b-c有边,那么新图的边集就是(1,a)->(2,a),(1,b)->(2,b),(1,c)->(3,c),(1,b)->(1,c)…这样的集合。定义δ(a,b) 为两点最短路, tr(G) 代表图G上任意三元组中3个δ和的最大值给出n棵树,问做笛卡尔积后tr的值原创 2021-05-08 21:32:24 · 364 阅读 · 3 评论 -
Codeforces 808F 最大权独立点集,二分
题目链接https://codeforces.com/contest/808/problem/F题意给出n个三元组<p,c,l>,任选若干个,要求符合相加为质数的两个组不能同时选∑p>=k求所有可行选择方法中max{l}最小值思路首先可知答案单调,我们可以二分l来进行处理至于每次处理,条件一中相加为质数的情况其实可以分为两种:1+1和奇数加偶数。对于1+1型,显然我们只能选择一个p最大的1时是最优的,而奇数+偶数这个条件就很有意思了,我们把c按奇偶性划分,对所有不能一原创 2021-04-08 21:56:20 · 214 阅读 · 0 评论 -
CodeForces-1062E LCA,DFN,RMQ
题目链接https://vjudge.net/problem/CodeForces-1062E题意给出一棵树,编号1-n,每次询问L-R区间点中,删掉一个点后LCA的最小深度(根为0),输出删去的点和深度思路训练的时候只想到了最暴力的O(n²qlog(logn))O(n²qlog(logn))O(n²qlog(logn))的算法。仔细观察,发现一组点的LCA就是dfn最小和最大的点的LCA,那么如果删点,肯定是删去这两个点其中之一。于是我们用线段树维护区间dfn最大最小值,对于每个询问我们处理原创 2021-04-04 15:13:29 · 245 阅读 · 1 评论 -
图的连通性相关总结:强连通,双连通,割点割边,2-sat
刚学完了连通性相关的知识,总结一下以下均使用tarjan算法强联通分量定义强连通分量即强联通子图,一般我们都在有向图中求取最大强连通分量,即一张图中任两点可达的最大子图。其中单独一个点也是强联通子图。算法在这里我们使用tarjan算法,维护两个栈,系统堆栈(递归隐式使用),连通子图堆栈。维护两个数组,dfn时间戳数组和low最小可达(自己取的名字)数组。算法过程如下:对每一个联通块调用tarjan函数,他的运行和dfs类似,会给访问到的节点打上时间戳,并把所有经过节点加入栈中。同时维护low原创 2020-12-29 11:58:00 · 677 阅读 · 0 评论 -
2020ICPC·小米 网络选拔赛第一场 Router Mesh
题目链接https://ac.nowcoder.com/acm/contest/7501题意求出图中删去每个点后联通块数目思路tarjan算法求割点修改维护dfn和low数组,对于边u-v,如果low[v]>=dfn[u],说明只可以通过u到达v,u是割点,删除u会增加一个连通数,那我们记录增加的连通数个数,记为tmp。当u不是树根时,删点后父亲也是一个分量,那么删去后联通块数目从1变到了tmp+1,如果是树根,则是从1变到了tmp。我们记变成的联通块个数为ans。那么对于删去的每个点,联原创 2020-12-28 11:40:09 · 199 阅读 · 1 评论 -
cf1440D Graph Subset Problem 图论 (拓扑序),邻接表二分查找边
题目链接https://codeforces.com/problemset/problem/1440/D题意给出一张图,问是否出现大小为K的强联通子图K个节点具有K个以上邻居的点集思路第二种最好求,利用拓扑排序思路,所有度小于k的点入队,挨个删点,更新度数,直到队空,如果没入队的节点数大于等于k,那么存在第二类。第一种较麻烦,大小为k的子图每个节点度数一定为k-1,子图是原图不断删点生成的,这个过程正好是第二种求取过程。在队列每次取出点时,如果其度数是k-1,就将它所有邻居(已经入队并且原创 2020-11-29 14:52:50 · 236 阅读 · 0 评论 -
codeforces1422D Returning Home 最短路 思维建图
题目链接https://codeforces.com/contest/1422/problem/D题意n*n网格,m个特殊点,和特殊点x或y坐标相同的点可以直接传送到特殊点,人物移动只能上下左右,给出起始点终止点坐标,保证起始点终止点不是特殊点,求最短距离思路最短路,难点在于建图。思路和HDU - 4725 相当接近。我们无法处理m²级别的边,但每一个特殊点可以和同一行或者同一列的点传送,那么我们可以为每一个节点建立一个x轴对应点和一个y轴对应点。1e5的点处理后最多变成3e5。我们将特殊点和原创 2020-11-29 13:25:54 · 251 阅读 · 0 评论 -
POJ - 1734 D - Sightseeing trip 最小环路径输出模板题
题目链接https://vjudge.net/problem/POJ-1734/origin题意求最小环输出路径思路上次偷懒没学最小环路径输出,这次栽了。。回顾弗洛伊德最小环floyd外层k循环时,得到的dis[i][j]是只使用1—k-1的节点连接的i-j最短路,那么枚举i和j,k—i---(i-j最短路径)—j---k就是只使用前k个点的所有最短路,枚举到n即可。注意我们k—i---(i-j最短路径)—j---k中,i-j最短路径是跑出的dis数组的值,而k-i和j-k都是原来的路径,所以原创 2020-11-28 22:15:54 · 126 阅读 · 0 评论 -
Number of Simple Paths CodeForces - 1454E 图论,简单路径数
题目链接https://vjudge.net/problem/CodeForces-1454E题意n点n边,保证联通,求简单路径数(1-3-2和1-2-3算两条,1-2-3,和3-2-1算一条)思路n点n-1边即可联通,多加一边则必有且仅有一环。这时我们可以将图看作一个环加上各个环点为根延伸出了子树。所有简单路径可以统计任意两点间的路径数再加和。分析两点u和v的情况:u和v都在环上:则u-v路径有两条u或v在环上,另一点在该点环外子树上:路径仅一条u或v在环上,另一点在环外不是该点子原创 2020-11-27 13:53:11 · 346 阅读 · 0 评论 -
最小环问题总结(有向,无向,经过某一点)
最小环顾名思义,最小环即为带权图中最短的环路算法主要是floyd和dij两种Floydfloyd三层循环中,最外层k循环代表用上第k个点的最短路,在刚开始时,所有节点最短路中都是仅包含前k-1个节点的,我们在floyd跑带有k节点的循环前进行操作,枚举i,j。i-j-k-i为一个可能的环路。其中i-j我们用跑出的dis数组来表示,因为floyd性质确保了i-j的最短路中没有k节点存在,之后j-k和k-i我们用他们之间本来的边来表示,更新答案。代码#include<cstdio>原创 2020-11-08 16:37:47 · 2485 阅读 · 7 评论 -
Acwing 860 二分图判断模版题 染色法
思路二分图定义(白话版):可以将点分为A.B两个集合,图中所有的边都是A-B集合之间连边判定条件:不存在长度为奇的环,充要条件。实现:染色法,每个点和相邻的点染不同的颜色。代码//二分图判定:当且仅当不存在长度为奇数的环时是二分图//实现:染色法,每个点dfs即可 #include<cstdio>#include<iostream>#include<iomanip>#include<map>#include<unordered_m原创 2020-11-02 18:24:07 · 132 阅读 · 0 评论 -
CodeForces - 1436D Bandit in a City
题目链接https://vjudge.net/problem/CodeForces-1436D题意n个节点,n-1条单向边,连通图,每一个点有一定的人数,人们从1点开始,沿单向路走动,歹徒从1点开始,沿道路追赶,追到无路可走停止,歹徒知道所有人的位置,整张图的情况,人们也知道歹徒位置,人可以相互配合,问人和歹徒都选择最优策略情况下,歹徒能追到的人数思路我们先跑一遍dfs处理每个节点为根的子树的总权值和叶子节点个数。当最理想情况下,某一根节点的全部人(包含子节点的人)都平均的走向不同的路,最终歹徒原创 2020-10-26 22:42:05 · 316 阅读 · 0 评论