
图论
文章平均质量分 50
图论
Legendout
退役ACM银牌loser
展开
-
G 林克与宝箱咒语
【代码】G 林克与宝箱咒语。原创 2022-09-13 19:33:20 · 361 阅读 · 0 评论 -
虚树 (模板)
[SDOI2011] 消耗战 - 洛谷虚树,就是用来在图上dp时,避免无用的点太多影响时间的一种优化方式,它新建了一张图,从而减少无关点的遍历,在稀疏图上时能大大优化时间。具体做法就是,把所有关键点按dfs序排序,然后一条链一条链地遍历,其中会出现4中情况,参考大佬博客:题解 P2495 【[SDOI2011]消耗战】 - Rhodoks 的博客 - 洛谷博客 我们按照栈来遍历就正好符合由一条链跳到另一条链的过程,叶节点先出栈,根节点不变,再入新的链,按照不同情况连点,目的是保证这些关键点互相连接。参考代码原创 2022-06-26 14:08:49 · 200 阅读 · 0 评论 -
P3387 【模板】缩点
给定一个 nnn 个点 mmm 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。第一行两个正整数 n,mn,mn,m第二行 nnn 个整数,其中第 iii 个数 aia_iai 表示点 iii 的点权。第三至 m+2m+2m+2 行,每行两个整数 u,vu,vu,v,表示一条 u→vu\rightarrow vu→v 的有向边。共一行,最大的点权之和。样例输出 #1提示对于 100%10原创 2022-06-23 12:24:19 · 193 阅读 · 0 评论 -
P3243 [HNOI2015]菜肴制作 (拓扑排序)
[HNOI2015]菜肴制作 - 洛谷建反图跑字典序最大top_sort即可。/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int long long#define ll long long#define db(x) cerr<<(#x)<<" "<<(x)<<" "<<endl;#defi原创 2022-05-29 14:34:52 · 211 阅读 · 0 评论 -
P1395 会议 (树的重心)
会议 - 洛谷题目描述有一个村庄居住着 nn 个村民,有 n-1n−1 条路径使得这 nn 个村民的家联通,每条路径的长度都为 11。现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么村长应该要把会议地点设置在哪个村民的家中,并且这个距离总和最小是多少?若有多个节点都满足条件,则选择节点编号最小的那个点。输入格式第一行,一个数 nn,表示有 nn 个村民。接下来 n-1n−1 行,每行两个数字 aa 和 bb,表示村民 aa 的家和村民 bb 的家之间原创 2022-05-26 21:39:38 · 249 阅读 · 0 评论 -
P3629 [APIO2010]巡逻 (树的直径 思维)
[APIO2010]巡逻 - 洛谷感觉有点偏思维把,但是仔细想想还是可做的。首先每条路都要走,那么我们把最长的路首位连接,就可以少最长的路的距离-1.因为不用来回走了。即求直径。那么如果是两条路,我们也要求另外一条直径。但是此时,第一条和第二条中重合的部分就不能算了,算就是只走一次的意思,但重合导致我们要走两遍,所以反而还要把边权变负。那么再求一次直径即可。数据比较好搞。前一次可以用dfs,顺便求出直径信息;后一次有负边,只能dp求。dp好像也能求直径信息吧,不会啊。/*keep原创 2022-05-30 09:41:43 · 175 阅读 · 0 评论 -
树网的核加强版 (树的直径 尺取法 思维)
树网的核加强版 - 洛谷比较明显的就是求出直径,这样路径最远的即为端点,比较好求;那么我们求出直径后可以尺取直径,统计答案。最后还有一种情况:路径上的一个分支的偏心距大于答案,这是完全可能的。那么我们再对直径上的点dfs一次,再统计一次答案即可。/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int long long#define ll lo原创 2022-05-26 13:11:15 · 131 阅读 · 0 评论 -
欧拉路
/*图中经过所有边恰好一次的路径叫欧拉路径(也就是一笔画)。如果此路径的起点和终点相同,则称其为一条欧拉回路。2.2. 欧拉路径判定(是否存在):有向图欧拉路径:图中恰好存在 11 个点出度比入度多 11(这个点即为 起点 SS),11 个点入度比出度多 11(这个点即为 终点 TT),其余节点出度=入度。有向图欧拉回路:所有点的入度=出度(起点 SS 和终点 TT 可以为任意点)。无向图欧拉路径:图中恰好存在 22 个点的度数是奇数,其余节点的度数为偶数,这两个度数为奇数的点即为欧拉路径.原创 2022-05-22 11:42:10 · 333 阅读 · 0 评论 -
K短路 A*算法 假 可持续化可并堆 真
学了一会k短路,发现是板子题,但是有A*的假算法,可持久化可并堆优化的真算法。理解了A*的,就是单调队列里bfs,第k次访问到的点就是第k大。单调队列里用一个估价函数,为已经走过的距离+到终点的距离。后者用终点跑个最短路即可。可持久化可并堆。。。。。看都看不懂。用什么路径树搞搞,在用什么优化,前置只是还是左偏树,这还算好学,但是useless啊。算了,回头抄个可持久化可并堆优化,学学怎么改就行了。先贴个过不了题的 A*做参考:/*keep on going and never give原创 2022-05-22 11:41:15 · 126 阅读 · 0 评论 -
D. Toss a Coin to Your Graph...(图论 二分)
Problem - D - Codeforces要在一个有向图找长度大于k的路径,且最大点权最小,一眼二分。考虑在图中把小于的点找出一条路径长度大于k,或是有环。那么我们每次扫一遍,只在点权小于的部分跑拓扑排序即可。/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int long long#define ll long long#define i原创 2022-05-15 15:36:00 · 410 阅读 · 1 评论 -
Hemose on the Tree (构造)
Problem - E - Codeforces懒得证明答案一定大于等于n。那么考虑怎么构造。小于n的数和大于n的数唯一的差别就是二进制上n哪一位有没有1.设根节点为n,我们每次建边都把边权和点权设为x和n+x,这样保证每次异或路径值只会为n。此时在判断一下边权和点权的分布方式,谁为x谁为x+n即可。/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int l原创 2022-05-14 11:31:12 · 134 阅读 · 0 评论 -
Vlad and Unfinished Business (图论)
Problem - F - Codeforces考虑枚举x到y上的路径。路径上的点分为有things的和没有的。有的话就过去跑一次。加上就行了。/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int long long#define ll long long#define db(x) cerr<<(#x)<<" "<<原创 2022-05-13 16:11:47 · 209 阅读 · 0 评论 -
Remove Directed Edges (DAG-dp)
Problem - G - Codeforces删完之后肯定是一条链。那么进行一个链上dp就行了。因为每个点都要删边,所以入度出度不符合的不能算上。/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int long long#define ll long long#define db(x) cerr<<(#x)<<" "<&l原创 2022-05-13 16:08:14 · 161 阅读 · 0 评论 -
Codeforces Global Round 20
Codeforces Global Round 20(F,H)_不是张胖胖的博客-优快云博客orz orz orz原创 2022-05-13 16:00:32 · 246 阅读 · 0 评论 -
树上启发式合并详解 dsu on tree (图论)
算法简介:在支持离线查询的与子树有关的题目中可以离线处理每个点的信息然后查询。常见的题目有查询某子树颜色数量即相关信息。算法思想:考虑最简单的处理方法:对每个点都遍历一次子树所有节点求相关信息,复杂度为,明显没有实际应用意义。仔细思考过程,我们可以发现每个点的信息求出来了之后,只对当前子树和父节点有作用,对其同深度的子树没有任何意义,反而我们还需要求一遍之后清除记录之后才能求其他点的信息,不然会冲突。此时算法的瓶颈出现了:遍历的不可避免,能不能把每个点的求解降复杂度呢?想想求解的原创 2022-05-03 22:46:38 · 515 阅读 · 0 评论 -
P1262 间谍网络 (图论 缩点)
题目描述由于外国间谍的大量渗入,国家安全正处于高度的危机之中。如果 A 间谍手中掌握着关于 B 间谍的犯罪证据,则称 A 可以揭发 B。有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报。所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子。因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报。我们的反间谍机关提供了一份资料,包括所有已知的受贿的间谍,以及他们愿意收受的具体数额。同时我们还知道哪些间谍手中具体掌握原创 2022-05-02 20:47:04 · 414 阅读 · 0 评论 -
P1119 灾后重建 (floyd)
题目背景B 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。题目描述给出 B 地区的村庄数NN,村庄编号从00到N-1N−1,和所有MM条公路的长度,公路是双向的。并给出第ii个村庄重建完成的时间t_iti,你可以认为是同时开始重建并在第t_iti天重建完成,并且在当天即可通车。若t_iti为0...原创 2022-04-30 19:05:25 · 260 阅读 · 0 评论 -
点分治详解 ( 数据结构 )
啦啦啦,更新啦~学习笔记: 前置知识:树的重心、线段树等类似数据结构。点分治是一种十分高效的树上路径查询的数据结构,能在复杂度内查询所有路径信息。它与线段树和分块的思想十分相似,用已求出的信息来帮助处理之后需要求的信息。那么在树上呢,我们就可以先dfs一遍,然后用求出的dis信息来求解路径信息。那么我们把所有的路径分为两种:经过当前根节点的和不经过当前根节点的。后者可以递归根节点转化为前者。具体语境下求的东西不一样,这里介绍模板中距离小于k和等于k的做法。算法流程:...原创 2022-04-27 12:52:47 · 3843 阅读 · 0 评论 -
割点,割边
【模板】割点(割顶) - 洛谷留坑。/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int long long#define MAX 0x3f3f3f3f#define fast std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);const int maxn=2e5+10;int head原创 2022-04-27 12:51:17 · 92 阅读 · 0 评论 -
网络最大流
【模板】网络最大流 - 洛谷题目描述如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。输入格式第一行包含四个正整数n,m,s,tn,m,s,t,分别表示点的个数、有向边的个数、源点序号、汇点序号。接下来mm行每行包含三个正整数u_i,v_i,w_iui,vi,wi,表示第ii条有向边从u_iui出发,到达v_ivi,边权为w_iwi(即该边最大流量为w_iwi)。输出格式一行,包含一个正整数,即为该网络的最大流。输入输出样例4...原创 2022-04-27 10:34:27 · 301 阅读 · 0 评论 -
CF1659E AND-MEX Walk (图论 并查集 思维 MEX)
Problem - E - Codeforces题意:给定一个无向带权图,总共有nn个点mm条边,选定一个起点uu和终点vv,现在你需要确定一条路径,设路径上的kk条边的边权为w_1,w_2,\dots,w_kw1,w2,…,wk,求出 MEX({w_1,w_1 & w_2,w_1&w_2&w_3,w_1&w_2&w_k}的最小值。其中 MEX 指集合中最小的不存在的自然数。数据范围:n,m\le 10^5n,m≤1...原创 2022-04-26 22:14:04 · 504 阅读 · 2 评论 -
Where are you(最小生成树 图论)
链接:登录—专业IT笔试面试备考平台_牛客网题目描述小p和他的朋友约定好去游乐场游玩,但是他们到了游乐场后却互相找不到对方了。游乐场可以看做是一张n个点,m条道路的图,每条道路有边权wi,表示第一次经过该道路时的花费(第二次及以后经过时花费为0)。现在,小p要去找他的朋友,但他的朋友行踪很诡异,小p总是要遍历完这n个点才能找到他,同时小p希望总花费最小。找到朋友的方案可能不唯一(具体看样例解释),小p想知道在这所有的方案中,有多少条边在每个方案中都会被经过。输入描述:第一行两个整.原创 2022-04-24 22:44:58 · 315 阅读 · 0 评论 -
最短路 (dij 二进制)
链接:登录—专业IT笔试面试备考平台_牛客网题目描述给定长度为 n 的数列 a,如果 ai&aj≠0a_i \& a_j\neq 0ai&aj=0(按位与),则在 i,j 之间存在一条长度为 ai+aja_i+a_jai+aj 的边,求 1 至所有点的最短路。输入描述:第一行一个正整数 n。接下来一行 n 个整数 a1∼ana_1\sim a_na1∼an。输出描述:输出一行 n 个整数,第 i 个为 1 到 i 的最短路长度。不能.原创 2022-04-24 21:45:49 · 385 阅读 · 0 评论 -
牛客月赛48 C F(差分 树形dp 素数筛)
牛客小白月赛48_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJps:赛时只出了4题,难过。明天打天梯赛,本来是康复训练,没AK不爽啊。补俩个题解下班算了。cf都没打。越欠越多。五一看来要补好几场cf了。不过晚点补,补题轻松一点。网上题解……一言难尽。C:可疑的区间给出n个有趣的区间编号分别为1∼n1\sim n1∼n。给出一个整数len ,对于任意一段长度为len 的区间[l,r],(r−l+1=len),其中l是正整数。其有趣值的定义为:与...原创 2022-04-23 00:34:44 · 593 阅读 · 0 评论 -
二分图匹配
先胡言乱语一下,改天写真了再改。二分最大匹配就是一个看看已匹配的能不能挪一下位置,递归解决。/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int long long#define endl "\n" #define pb push_back#define dbg1(x) cerr<<(#x)<<" "<<(x)&l原创 2022-04-21 00:03:01 · 140 阅读 · 0 评论 -
P1250 种树(差分约束)
种树 - 洛谷题目背景一条街的一边有几座房子,因为环保原因居民想要在路边种些树。题目描述路边的地区被分割成块,并被编号成1, 2, \ldots,n1,2,…,n。每个部分为一个单位尺寸大小并最多可种一棵树。每个居民都想在门前种些树,并指定了三个号码bb,ee,tt。这三个数表示该居民想在地区bb和ee之间(包括bb和ee)种至少tt棵树。居民们想种树的各自区域可以交叉。你的任务是求出能满足所有要求的最少的树的数量。输入格式输入的第一行是一个整数,代表区...原创 2022-04-18 20:53:57 · 320 阅读 · 0 评论 -
紫魔法师 (思维 图论 dfs)
链接:登录—专ti业IT笔试面试备考平台_牛客网题目描述“サーヴァント、キャスター、Medea。”--紫魔法师给出一棵仙人掌(每条边最多被包含于一个环,无自环,无重边,保证连通),要求用最少的颜色对其顶点染色,满足每条边两个端点的颜色不同,输出最小颜色数即可输入描述:第一行包括两个整数n,m,表示顶点数和边数n <= 100000, m <= 200000接下来m行每行两个整数u,v,表示u,v之间有一条无向边,保证数据合法输出描述:一行一个整数表示最.原创 2022-04-16 21:58:43 · 93 阅读 · 0 评论 -
P1364 医院设置 (树的重心)
医院设置 - 洛谷题目描述设有一棵二叉树,如图:其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为11。如上图中,若医院建在1 处,则距离和=4+12+2\times20+2\times40=136=4+12+2×20+2×40=136;若医院建在33处,则距离和=4\times2+13+20+40=81=4×2+13+20+40=81。输入格式第一行一个整数nn,...原创 2022-04-13 19:52:59 · 373 阅读 · 0 评论 -
NC234866 缆车 (思维,图论,最近公共祖先)
传送门:登录—专业IT笔试面试备考平台_牛客网题目描述牛妹:“冬天到了,我们一起去坐缆车吧!”景区有 n个景点,入口在编号为 1 的景点的位置,景区内有 单向缆车,从编号为 1 的景点可以通过缆车到达任意一个其它的景点。具体来说所有景点中的道路形成了一个树状结构,树根则是编号为 1 的景点,每条树边都是从父亲指向儿子的单向边。景区改造开始了,景区现在的管理员牛牛规划出了 个结点用于改造,它将指定一个景点 作为去向这 个景点的中转景点(当然,中转景点本身也可能处在这待改造的 个...原创 2022-04-13 12:34:08 · 971 阅读 · 0 评论 -
G. Damaged Bicycle (状压dp 最短路)
传送门:Problem - G - Codeforces题意:一个有向图,有k个单车,每个单车有概率是坏的,骑单车比走路快,问1节点到n节点的最小期望。题解:首先一个一个地去找单车,如果前面的没找到,就往后找;记忆化搜索的话,就得先从起点,当作额外的一个单车,然后一直往下搜,状态上有一的就说明来过这个点,跳过;最先保存的状态就是1到k-1全坏的情况;然后依次返回记忆化搜索的值。#include <bits/stdc++.h>using namespace std;//原创 2022-04-06 21:49:31 · 1037 阅读 · 0 评论 -
CF911F Tree Destruction(树的直径)
Problem - F - Codeforces题意:给一棵树,每次加上两个叶节点的距离并删除其中一个叶节点,问最大总距离和是多少。题解:叶节点的最大距离肯定是直径两端的距离;那么直径之外的点与其他节点的最远距离肯定在直径的某一端。那么我们首先把直径和其两端点求出来,再加上此节点到那个端点的距离;这个距离可用两个dfs 求直径端点时顺便求出;再考虑直径上的点,每次删掉一端的点就好了,sum+=;/*keep on going and never give up*/#include&l原创 2022-04-02 21:07:51 · 410 阅读 · 0 评论 -
CF14D Two Paths (树的直径)
Problem - 14D - Codeforces题意:求一棵树上两条不相交直径的最大乘积。题解:由于n<200,考虑枚举每个点断开的情况,从断开的两端求直径。代码:/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int long long#define ll long long#define fast std::ios::syn原创 2022-04-02 16:42:31 · 876 阅读 · 0 评论 -
Poj2024 NOI2001 食物链(扩展域并查集)
原题链接:1182 -- 食物链题意:动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是"1 X Y",表示X和Y是同类。第二种说法是"2 X Y",表示X吃Y。此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话原创 2022-03-29 15:40:17 · 153 阅读 · 0 评论