随笔分类 - 图论
摘要:首先,如果是一个 DAG 的话入度不为 0 的点肯定可以都选. 然后如果是一般图的话我们缩点,考虑对于一个强连通分量如何处理: 如果该强连通分量入度为 0 ,那么一定有一个点不能选,其他点都能选. 如果该强连通分量入读不为 0,那么肯定所有点都可以选. 由于缩完点后是一个 DAG 的形式,我们一定可
阅读全文
摘要:通过这道题了解二进制分组. 由于我们只需要求两两之间最短路的值而不需要求具体是哪两个点得到的最短路,可以使用二进制分组. 因为如果两个点对答案有贡献,那么这两个点一定在某个二进制位上不同,而 dijkstra 可以方便地求两个集合之间的最短路. 然后注意对于两个方向要分别跑一个 dijkstra.
阅读全文
摘要:往届学长的一场比赛. 总结:三道水题 haha! Task 1 省选 jloi.cpp/in/out 给你一个字符串,你每次只能删除一个回文串,问你最少需要几步将字符串删完,或输出无解. 题解:显然,答案最多为 2,而如果这个串本身就不是回文串答案就是 1,所以难点就是判断无解的情况. 手画几组发现
阅读全文
摘要:调都没调就 1 A 了,开心. 一些细节: 1. 当 3 个点中强制一个点不选时,又有 $(h_{i},h_{j})$ 这种限制时直接跳过即可. 2. 当有 $(h_{i},h_{j})$ 且 $i$ 这个位置存在,但是 $j$ 不存在的时候显然是不可以选择 $i$ 的,那就直接让 $i$ 连 $i
阅读全文
摘要:显然取对数,然后二分答案进行 01 分数规划. 设 $f[i][j]$ 表示在 AC 自动机上的点 $i$ ,匹配到了 $j$ 位的最大价值. 转移的时候判断一下当前是点还是数字,然后在 AC 自动机上的终止节点上算一下贡献就行. 构建 AC 自动机的时候要注意:点 $i$ 的价值是 val[i]+
阅读全文
摘要:显然,对于一条边的两个端点必须选择一个;对于一个块内的点,只能选择一个. 第一种限制好满足,第二个限制的话前/后缀和优化一下建图就行可. code: #include <bits/stdc++.h> #define N 4000009 #define ll long long #define set
阅读全文
摘要:好神仙的一道题! 由于每个门对应的钥匙仅有一把,所以我们可以确定门和门之间的相对解锁顺序. 比如,解锁门 $(x,x+1)$ 的要是在 $[1,x]$ 之间的话 $x+1$ 无论如何也到不了 $x$ 这一侧,但是 $x$ 有可能可以到达 $x+1$ 这边. 所以我们就先去解锁 $x+1$,然后再去解
阅读全文
摘要:这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可. code: #include <cstdio> #include <string> #inclu
阅读全文
摘要:非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话连边一定不是优秀的(一定会有一种都在管辖范围之内的连边方式来代替这种连边方式) 然后由于每一个点只属
阅读全文
摘要:显然,我们可以将询问按照规定时间从小到大排序,依次处理. 那么我们显然要求合法的点中从 $n$ 号点出发到达点 $i$ 的最迟时间,我们令这个为 $f[i]$ 而 $f[i]$ 显然可以用最短路来求. 如果求 $n$ 次最短路的话显然超时,但是我们可以对于每一个节点所连边排序,然后每次枚举之前没有扩
阅读全文
摘要:显然01分数规划转成二分答案+判断是否大于 0 的问题. 这个题有一个坑点:不止根节点的父亲可能是 0 号节点(0号节点也是不能省略的) code: #include <cstdio> #include <string> #include <cstring> #include <iostream>
阅读全文
摘要:就是喜欢后缀自动机,yy了一个只用后缀自动机解决的方法. 对 3 个串建立广义后缀自动机,然后建立后缀树. 标记出每个点在0/1/2个串中是否作为子串出现,然后将后缀树中 2 串结尾的所有子树都设为危险节点. 然后对于 SAM 来一个拓扑序DP,我们开始的时候默认危险节点的最大值是 -inf,然后
阅读全文
摘要:然而这只是 70pts 的部分分,考场上没想到满分怎么做(现在也不会) code: #include <cstdio> #include <string> #include <stack> #include <queue> #include <cstring> #include <algorithm
阅读全文
摘要:判断有没有解:让所有没有障碍的格子都放一个士兵. 那么,题中要求最少放几个士兵,就是最多拿走几个士兵. 而由于行和列对士兵个数都是由要求的,这就规定了拿走的士兵的上界. 跑一个最大流来求就行了. code: #include <cstdio> #include <queue> #include <a
阅读全文
摘要:code: #include <bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in","r",stdin) const int N=200006; const double eps=1e-6; const double
阅读全文
摘要:考试的T3,拿暴力+剪枝卡过去了. 没想到 CF 上也能过 ~ code:
阅读全文
摘要:考试T1,建一个反图跑一个最短路就好了~ code:
阅读全文
摘要:好久没写过图论了,练练手~ code:
阅读全文
摘要:题意:给定一棵树,树上有一些点是警察局,要求所有点到最近的警察局的距离不大于 $d$,求最多能删几条边 ? 题解: 考虑什么时候一条边可以被断开:这条边的两个端点被两个不同的警察局覆盖掉. 我们要设计一种染色方案,使得整棵树都被覆盖,且每个警察局覆盖的范围尽量小. 那么,我们可以使用 $BFS$ 算
阅读全文
摘要:这个模型十分巧妙啊,好题好题~ code:
阅读全文

浙公网安备 33010602011771号