随笔分类 -  图论

摘要:Jennie 每个单词只有两个字符,那么就在这两个字符之间连一条边。 最后n+1个字符,显然是所有单词只出现了一遍 这样我们的目标就是找一条欧拉路径就可以了 #include<iostream> #include<cstdio> #include<algorithm> using namespace 阅读全文
posted @ 2021-07-27 23:10 Simex 阅读(45) 评论(0) 推荐(0)
摘要:blackpink yyds 这道题目还是很有意思的,叫什么最短路径生成树。 显然的一个做法就是用类似于prim的方法,维护一个已经和1联通的集合以及所有点到1的最短路 然后按照距离dis的距离进行枚举,每次从集合里找到可以在加进去之后令新点补全。 然后这个过程可以懒得维护,直接检查每一个点和他周围 阅读全文
posted @ 2021-07-25 16:09 Simex 阅读(89) 评论(0) 推荐(0)
摘要:Archie 显然做法就是建反图,每个点都遍历一下,然后​能过 然而有几个点死能卡常数,怎么办呢 干他 如果一头牛不能到达所有奶牛,它能到的所有牛都不行,同理,如果一头奶牛可以,它能到的所有牛都行 然而,这么干还是会被最后一个点干掉。 采用vector,对于每一个点的出边从小到大排序,因为最后枚举是 阅读全文
posted @ 2021-07-17 20:27 Simex 阅读(63) 评论(0) 推荐(0)
摘要:Archie 很显然的换根dp #include<iostream> #include<cstdio> #include<cstring> using namespace std; int son[100001]; int dis[100001]; int n; int a,b; int head[ 阅读全文
posted @ 2021-07-16 17:32 Simex 阅读(72) 评论(0) 推荐(0)
摘要:Archie 首先很显然的是,无论怎么选,这里肯定会有一条贯穿的横向和一条纵向的骨架 那么问题来了,剩下的呢 按照大小一个一个插,不要有环出现 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #def 阅读全文
posted @ 2021-07-11 22:19 Simex 阅读(129) 评论(0) 推荐(0)
摘要:这里应该写什么 很显然,先把所有学生排序并且分组 然后,把两个组合并 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define int long long using namespace std 阅读全文
posted @ 2021-07-08 21:24 Simex 阅读(38) 评论(0) 推荐(0)
摘要:Aimee 按照依赖顺序建图后,显然可以发现一个递推的关系,如果一个点入度为零,那么它就可以完成 这样从入度为零的点开始更新,删边,并且在度数又为零后加入待处理的队列 #include<iostream> #include<cstdio> #include<algorithm> #include<q 阅读全文
posted @ 2021-06-03 14:34 Simex 阅读(95) 评论(0) 推荐(0)
摘要:Aimee "Doctor,你这水平下降的有点。。。" '"我怎么知道能手残写了个return p" 很显然,那条路径一定在最大生成树上,然后在这条树上跑LCA即可 #include<iostream> #include<cstdio> #include<algorithm> #include<cs 阅读全文
posted @ 2021-05-30 20:06 Simex 阅读(53) 评论(0) 推荐(0)
摘要:❤Aimee❤ 和普通的最短路相比,多了一个免费边的限制 可以考虑得到,如果没有免费边的话,其实也就都一样了,那么考虑只有一个免费边 我们使用了之后,是不是就相当与进入了一个新的(没有边可以免费的)图,在这张图上,就和原来一样跑最短路就可以了 推而广之,结合一下dp的思想,可以把图分成$k$层,每用 阅读全文
posted @ 2021-05-17 17:11 Simex 阅读(51) 评论(0) 推荐(0)
摘要:Aimee 这是个dp?不过没有必要用dp 毕竟显然距离为2中间一定要经过一个点,那枚举中间点即可 之后显然假设一个点所有相邻的点的点权为集合$A= { a_1,a_2,a_3······a_k}$ 显然对于这个点,和就是$\sum_{1} \sum_{1} a_i*a_j |i!=j$ 那么这样上 阅读全文
posted @ 2021-02-21 20:54 Simex 阅读(99) 评论(0) 推荐(0)
摘要:Aimeeeee 把原图改造一下$>=mid$那么权值为1,反之为0 然后跑最长路,如果最长路不小于0,那么就可行,反之不行 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queu 阅读全文
posted @ 2020-12-03 20:49 Simex 阅读(209) 评论(0) 推荐(0)
摘要:Aimeeeeeeeeeeeeeeeeeeeeeeeeee 很简单的东西 就是用tarjan缩个点,然后对于这个新图,考虑入读和出度为1的点就行了 #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #i 阅读全文
posted @ 2020-11-05 20:40 Simex 阅读(90) 评论(0) 推荐(0)
摘要:Aimee tarjan是一个好东西 如果这个题没有环,那很简单 讨厌环 那就缩点,毕竟说了一个边只算一次 tarjan找到强联通分量,然后缩成一个点 怎么做呢? 有一个dfn,也就是时间戳,还有一个low,表示能向下到达的最小的时间戳 然后dfsssssssssssssssssssssssssss 阅读全文
posted @ 2020-11-04 21:49 Simex 阅读(88) 评论(0) 推荐(0)
摘要:Aimee 好不容易得到了这个称号,别着急摘下来 --scz 你也可以不用次小生成树做 但是也可以 次小生成树和最小一样大就证明不止一个 次小生成树要是不严格的话,只需要在求出的最小生成树上,加入一条新边,然后生成了一个环,在这个环上呢,删掉最大的边就行了 然后在最小生成树上加一点点东西就够了 存一 阅读全文
posted @ 2020-11-03 20:50 Simex 阅读(107) 评论(0) 推荐(0)
摘要:Aimee 很水的题目 只要把P1144改一下 需要注意的是这个题有重边,求方案数的话一定要去重!! 这就涉及到很有趣的问题。 要想成为顶尖高手 就要做到滴水不漏 --橙汁哥 从这个题我才知道我写的堆优化Dijkstra复杂度有问题 TLE起飞 #include<iostream> #include 阅读全文
posted @ 2020-10-27 23:40 Simex 阅读(76) 评论(0) 推荐(0)
摘要:Miku 很水的拓扑排序+dp 看错题除外。 这道题是要求有多少条食物链满足 左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费 不是求最长的多长或者有几条最长!! (把一些无关紧要的变量起一些人名真有意思) #include<iostream> #include<queue> usi 阅读全文
posted @ 2020-10-21 23:24 Simex 阅读(71) 评论(0) 推荐(0)
摘要:Miku 很好的坑题,务必注意因为负边权和求路径的问题,这里需要同时用到两种方法,搜索和dp。 对于原来的情况,事实上就是每一条边都要走两次,(毕竟你还要回来啊) 但是你要是建了一条边,就会形成一个环,那么这辆车就可以直接走回去了(沿着这个圈回到出发点,也就是说,少了一条边长度的距离) 那么怎么搞呢 阅读全文
posted @ 2020-10-17 19:42 Simex 阅读(107) 评论(0) 推荐(1)
摘要:Miku 这题目很water 只要按照题意模拟就行了,数据似乎没有重边,那么对于加入每一条边的时候,如果两端点没联通,那么连上,反之 先连上,形成一个环,去点环上最大的边 数据范围不大对 #include<iostream> #include<cstdio> #include<algorithm> 阅读全文
posted @ 2020-10-06 15:33 Simex 阅读(141) 评论(0) 推荐(0)
摘要:Miku 我们只需要一个额外的点代表水库 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int head[400]; int n; int w[400]; int x,y,z; struct 阅读全文
posted @ 2020-10-05 23:27 Simex 阅读(101) 评论(0) 推荐(0)
摘要:链接:Miku 这里是O(\(n^2\))的做法 首先可以证明,对于每一条直径,求出的偏心距是一样的 怎么证明?显然(我不会) 怎样求树的直径?简单。 贪心:在一条直径上,显然选择的路径越长越好 实现:首先求出树上所有点之间的距离(\(n^2\))一直dfs就行 然后找出直径及直径经过的点 最后在直 阅读全文
posted @ 2020-09-19 20:30 Simex 阅读(117) 评论(0) 推荐(0)