![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
图论综合
文章平均质量分 52
1
kaka0010
退役ACMer/算法竞赛菜鸡
展开
-
树的直径(两次dfs & 树形dp)
定义设树上任意两点x, y之间的距离为dis(x, y),那么树的直径就是求这棵树中的Max {dis(x,y)}方法介绍1.树形dp优点:代码简单,可以求出以当前节点为根时的最长链,O(N)时间复杂度缺点:不能求出最长链的路径2.两次dfs(或bfs)优点:可以求出路径缺点:时间复杂度O(2N), 在负权边中无法使用求解方法1.树形dp我们假设dis[v]为以v为根的子树到u的最长距离,那么取v的父节点u,将v和u的子树到各自的最长距离拼接在一起,即ans = max(ans, di原创 2020-06-05 19:21:02 · 1013 阅读 · 1 评论 -
牛客练习赛56 E.小雀和他的王国 tarjan+生成树上求直径
原题链接:https://ac.nowcoder.com/acm/contest/3566/E目录题意分析Code题意有n个点,m条边的图,开始保证图联通,你可以加上一条边,求任意去掉一条边后存在两点不连通的概率。分析非常有意思的题目,转化一下题意就是求添上一条边之后桥的个数/边的总数桥的个数/边的总数桥的个数/边的总数然后我们已知在一条树上,添上一条边之后,该链上所有的桥都没了,因此我们只要求树的直径就可以了,这样可以消除最多的桥。但本题是在图上而不是在树上,其实仔细观察生成树,发现所有桥原创 2021-05-17 14:25:23 · 103 阅读 · 2 评论 -
HDU 6604 Blow up the city DAG图上建支配树
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6604目录DAG图上的支配树题意分析CodeDAG图上的支配树先来说一下支配树的简单概念,比如说我们要到a节点必须经过b节点,那么b节点就是a的支配点,在一棵支配树下,所有节点都是子树节点的支配点。总所周知DAG图是有向无环图,因此处理起来会比一般图上的轻松很多。建树时我们通过拓扑序可以轻松遍历出所有点,然后我们逆着拓扑序看,如果这个点的所有出度的父节点都已经确定了,那么他的父节点就是他所有出度的点的公共原创 2021-05-07 11:12:29 · 114 阅读 · 1 评论 -
2021牛客暑期多校训练营3 B.Black and white 最小生成树
原题链接:https://ac.nowcoder.com/acm/contest/11254/B目录题意分析Code题意你需要将n*m的矩阵全部变成黑色(初始为白色),每个点都有一个花费,并且如果任意一个矩阵的三个顶点为黑,那么剩下那个顶点自动变黑,问最小的花费。分析根本就没往图这方面想,题目还是具有很大的欺骗性。如果自己手画一下的话,很容易发现其实最少只要涂n+m-1个点就可以了,再与行和列联系一下,不就是以行列为点的最小生成树吗?我们再仔细分析一下,如果(x1,y1)(x2,y2)(x1,y原创 2021-07-28 10:27:43 · 129 阅读 · 0 评论 -
P5025 [SNOI2017]炸弹 线段树优化建图+缩点+DAG图上DP
原题链接:https://www.luogu.com.cn/problem/P5025目录题意分析Code题意在一个数轴上有n个点代表n颗炸弹,每颗炸弹引爆会引发r范围内的炸弹爆炸,问每颗炸弹引爆会最终引发多少颗炸弹爆炸,对答案∑i=1ni∗炸弹引爆数量\sum_{i=1}^ni*炸弹引爆数量∑i=1ni∗炸弹引爆数量%1e9+7分析锻炼代码能力的一道题,首先需要用到一个前置知识——线段树优化建图点击查看然后我们就可以连出所有这个炸弹能到的点,然后对在同一个强连通分量里的点进行缩点,这样可以让原创 2021-07-17 09:19:34 · 124 阅读 · 0 评论 -
2019 ICPC Asia Yinchuan Regional H - Delivery Route 强连通+最短路+拓扑
原题链接:https://nanti.jisuanke.com/t/42388题意有n个点,x条双向边且边权为正,y条单向边边权可以为负,问从某个点出发到全部点的最短距离。分析首先看到负权边,dij不能直接去用。然后就是这题刻意去卡了spfa,但没卡住spfa的玄学优化(可以自己去尝试)。这里说一下本题的正解,利用强连通分量和最短路来求。既然dij不能跑负权边,那我们只要保证让他只跑正权边就可以了,因此在加完双向边之后去找连通块,每个连通块内部跑dij,然后外部用拓扑。这里说两个细节开始原创 2021-03-01 15:02:34 · 317 阅读 · 1 评论 -
2021牛客寒假算法基础集训营6 H动态最小生成树 线段树优化kruskal
目录题意分析Code题意分析赛中直接暴力水过去了,现在补一个正解。拿到题目分析,如果是暴力枚举边,复杂度是qmlogm肯定是不行的。有些人会想,那我预处理一下边,然后修改时单点插入和删除,这样修改可以做到O(1),但还是得枚举边qm的复杂度也逃不掉,顶多少了一个log。还有一些高端选手可能就直接上待修莫队了,但常数也是大的吓人,因此题解中给到了线段树的优化。我们把线段树上的每个点都看成一个集合,代表了选择[l,r]范围的边所构成最小生成树的边集,这样每个点集其实最多只有n-1条边,一下子就减原创 2021-02-25 22:50:30 · 121 阅读 · 0 评论 -
CF 160D Edges in MST 最小生成树 + 割边
原题链接文章目录题意分析AC Code题意给定n个点和m条边,有三种情况这条边是最小生成树所必须的边这条边存在于不只一个最小生成树中这条边不包含在任何一个最小生成树中询问所有边的情况。分析如果一条边可以替换别的边成为最小生成树的边,那么它们的权值肯定是相同的,因此我们可以考虑所有权值相等的边。我们将这些边与当前连通块相连,如果存在一条边是桥,那么它一定是不可或缺的,所以答案记为any,否则为at least one。然后就是正常的最小生成树做法,如果这当前边的两个点都已经在连通块中了,原创 2020-12-20 20:09:10 · 283 阅读 · 0 评论 -
CF 1433G G. Reducing Delivery Cost 最短路+暴力枚举
原题链接文章目录题意分析AC Code题意有n个点和m条边的图,接着有k个询问,每次给定两个点ai和bi,问所有dis[ai][bi]之和。其中你可以指定一条边的代价为0。分析由于n的范围是1000,因此我们可以n^2log(m)的复杂度枚举出任意两点之间的距离。接着暴力去枚举边,如果设a,b这条边为0,那么我们考虑询问的两个点之间的距离怎么去计算。如果这条边不影响u,v之间的距离,那么距离还是dis[u][v],如果这条边对u,v之间的距离有影响,那么路径应该是min(dis[u][a] + d原创 2020-12-19 22:27:55 · 184 阅读 · 1 评论 -
CF 1242B B. 0-1 MST 补图连通块个数
原题链接文章目录题意分析AC Code题意图是有n个点组成的完全图,其中有m条边的权值为1,剩余权值为0,问将图连通的最小代价是多少。分析看题意就觉得是简单的生成树问题,但因为是完全图,因此没办法把所有边都存下来。因此我们考虑怎么去求补图的连通块,因为如果将边权为0的边全部用完,最后的代价就是剩余的连通块个数-1。我们可以用set来存边,再开一个set存点是否被遍历过,如果被遍历过则从set中删去,每次找下一个点时,只要当前点没有与下个点连边,即可以到达,因为是求补图,所以用set中的查询方法轻原创 2020-12-19 21:28:40 · 260 阅读 · 3 评论 -
CF 1436D Bandit in a City 树上贪心
原题链接文章目录题意分析AC Code题意给定一棵树形结构,每个点上都有一定的人数,人只能往叶子节点跑,根节点有一个土匪,问土匪最少能抓到多少人。分析我们只需要让所有的人均匀地跑到叶子节点就可以了,因此对于每个节点都有一个最优方案,也就是当前子树人数/当前子树叶子节点数+(人数%叶子节点 ? 1 : 0),最后取一个max就可以了,比较水的一道题。AC Code#include <bits/stdc++.h>#define ACM_LOCAL#define fi first原创 2020-12-19 09:47:06 · 171 阅读 · 1 评论 -
CF 891C Envy 最小生成树+可撤销并查集
原题链接文章目录题意分析AC Code题意给定n个定,m条边,接下来有k组询问,每次给定一个集合,问能否用这些集合的点构成MST。分析如果每次只问一条边,我们可以用树剖或树上倍增找到这条链上最大值再替换成询问的边,但现在询问为一个集合,因此问题复杂很多。关于kruskal有两个很有趣的定理定义wi为每一条边,对于任意wi,我们选择长度<wi的边构成的联通块是相同的定义最小生成树中边长为wi的边条数有ci条,对于所有的最小生成树来说,wi和ci都是相同的考虑离线的处理方法,我们把所原创 2020-12-18 14:09:10 · 318 阅读 · 1 评论 -
CF 1444C Team-Building 可撤销并查集+种类并查集判二分图
文章目录题意分析代码题意给定n个点,m条边,k个集合。每个点都属于自己的集合,每次取任意两个集合构成的子图,问是否是二分图,最后求二分子图的个数。分析根据题目的数据范围,暴力枚举子图加dfs判二分图是肯定会超时的,因此考虑另一种判二分图的方法,种类并查集。种类并查集判二分图的方法:假设x和y分别处于二分图的两部分,那么我们建立两个点的虚点x+n和y+n代表对立面的点,因此从x和y+n是处于一个集合中的,y和x+n同理。最后如果发现x和y在一个集合中,说明存在奇环即不是二分图。然后我们考虑两个集合原创 2020-12-17 20:52:43 · 164 阅读 · 0 评论 -
Shortest-path tree HDU - 4871最小路径生成树+点分治
原题链接题意:给定n个点,m条边。要求在图中找到一棵树,使得所有点到1的距离最短,然后给定k个点,要求经过k个点的路程最长,并求出最长的有几条。分析:转换一下题意,大概分为两个子问题1.求出关于1节点的最小路径生成树2.求出经过k-1条边的路径的最长距离和条数对于问题1,我们可以先跑一边最短路,求出所有点的最短路,然后从1开始遍历节点,如果dis[v] = dis[u] + w,那么说明这条边是合法的,我们就把它连上,因为要求按照字典序最小,所以我们把所有的边按照节点标号sort一下就搞定。对原创 2020-11-12 15:12:27 · 196 阅读 · 0 评论 -
2020杭电多校第四场 Go Running(二分图最小点覆盖)
题目链接比赛时一直以为是贪心题,结果一直被卡死, 只能说这应该是一道非常经典的二分图问题。将每个点放在坐标轴上,即(t, pos+vt),而已知v为1,而在同一条斜率为1或-1的直线上的点可能都是同一个学生,所以这就转化成了非常经典的最小点覆盖问题,最少用多少条斜率固定线可以覆盖所有的点。同时,我们可以把经过每个点的斜率为1和-1的直线与坐标轴的交点求出来,因为数据很大,记得离散化处理。因为最小点覆盖就等于二分图的最大匹配 (证明略) ,所以只要跑一遍匈牙利算法就ok了。怕被卡时间,所以用了原创 2020-07-31 13:47:01 · 354 阅读 · 0 评论 -
2020杭电多校(二) New Equipments (离散化+费用流)
原题链接题面题意给定n个员工,每个员工配一台机器,每台机器都会产生不同的费用,费用由给定的函数产生。由函数图像可知,这个二元函数是一个开口向上的函数,并且位于y轴上方,因此最小值会在对称轴附近产生。如题中所给的m值范围在(-1e8 ~ 1e8)之间,因此必须要离散化才能存在下。所以我们可以在对称轴附近找n个最接近的值,根据hall定理,自然能完全匹配。然后再将二分图的模型转换成网络流即可。#include <bits/stdc++.h>using namespace std;ty原创 2020-07-24 13:19:20 · 1004 阅读 · 5 评论 -
2020牛客暑期多校训练营(第一场) I 1 or 2 (最大流)
题面:题意给定n个节点和m条边以及每个节点的期望度数,问是否可以通过删去一些边使每个节点都满足期望度数。根据官方的解法应该是带花树的一般图匹配算法,但我不会 ,因此突发奇想可不可以转化为最大流的模型。...原创 2020-07-21 22:20:54 · 217 阅读 · 0 评论 -
P2746 [USACO5.3]校园网Network of Schools (tarjan强连通)
原题连接题意分析题目中提到即使B在A的分发列表中,A也不一定在B的分发列表中,即告诉我们这是一个有向图中的tarjan问题。在有向图中,我们常常会想到缩点的方法,因为在同一个强连通分量中,任意两点都是可以任意到达的,因此我们将其看成一个点,从而把带环的图变成DAG图。那么问题一就很明了了,我们只要给每一个起点(入度为0)的强连通分量分配一个新软件,那么所有学校都可以获得新软件。问题二要求给任意一个学校分配新软件都可以传遍所有学校,意思就是求加几条边可以让整个图变成强连通图。一个图如果是强连通图,那原创 2020-06-07 12:59:21 · 201 阅读 · 0 评论 -
双端队列BFS实现01最短路
什么是01最短路顾名思义,边权只有0和1的最短路。算法分析01最短路是最短路类型中比较特殊的一种,当然你也可以用一般的最短路解法(Dijkstra或spfa) 但总所周知利用bfs队列维护,时间复杂度往往只需要o(N)。那该如何实现呢?如果当前处理的点连接的边为0,那么将这个点移至队首,否则移入队尾,这样就可以保证队列的单调性。算法正确性当我们更新到的点边权为0时,那么这个点一定是到当前为止的最短路,所以可以直接将改点移至队首,如果这个点边权为1,那么这个点可能并不是到当前为止最短的,因此我们要将原创 2020-06-01 16:18:29 · 1759 阅读 · 1 评论 -
tarjan算法 (割点和桥)
最近刚学习了tarjan算法,发一篇博客写一下自己的心得和理解。在了解割点和桥之前,我们先理解什么是双连通。双连通和强连通分别是应用于无向图和有向图中的,那么在学习双连通之前,请自行学习求强连通分量的tarjan算法。在一张连通的无向图中,如果删去任意的一条连接u,v的边,但u, v仍然可以保持连通,那么我们可以称u,v之间是边双连通的。在一张连通的无向图中,如果删去任意的一个连接u,v的点,但u,v之间仍是连通的,那么我们可以称u,v之间是点双连通的。接着我们来认识割点和桥比如在这张图中,如原创 2020-05-23 15:38:16 · 678 阅读 · 0 评论 -
牛客小白月赛25 C白魔法师 (bfs | 并查集)
题目描述:题目链接题意分析:n个节点 n-1条边,非常明显的树形结构(题目中就有说 ),因此不需要考虑环的情况。树上有两种颜色,一种是白色一种是黑色,我们可以推断出这题应该是考虑连通块的大小,那么考虑两种思路,一种是bfs,一种是并查集。1.bfs我们可以用siz来记录这个连通块的大小,vis来记录这个点是否被访问到,sd记录每个点属于哪个连通块,因此利用bfs深搜的性质可得到所有连通块的大小。然后我们再逐个点处理,如果这个点是B,那么我们考虑如果将这个点染成白色之后的连通块大小,下面贴上代码原创 2020-05-21 16:35:24 · 313 阅读 · 1 评论