
搜索
文章平均质量分 66
DFS, BFS...
SHOHOKUKU
这个作者很懒,什么都没留下…
展开
-
Codeforces 769C 贪心 + BFS + DFS
题意传送门 Code forces 769C Cycle In Maze题解采用贪心策略尽可能地取字典序最小的方向。问题在于如何判断能否最终 kkk 步后返回起点,容易发现这个条件在时间序上具备单调性。那么 BFSBFSBFS 求起点至各点的最短路,同时记录逆向返回前驱节点的字典序最小的方向。最后 DFSDFSDFS 求解即可。总时间复杂度 O(NM+K)O(NM+K)O(NM+K)。#include <bits/stdc++.h>using namespace std;#defi原创 2022-02-17 22:47:22 · 360 阅读 · 0 评论 -
POJ 2888 Burnside 引理 + 矩阵快速幂 + DFS
题意传送门 POJ 2888 Magic Bracelet题解根据 Burnside 引理,令 C(i)C(i)C(i) 代表旋转 iii 个单位的置换下的不动点,则答案为原创 2022-01-11 11:13:48 · 240 阅读 · 0 评论 -
P4980 Pólya 定理 + DFS
题意传送门 P4980 【模板】Pólya 定理题解根据 Pólya 定理,本质不同的染色方案数为1n∑k=0n−1ngcd(n,k)\frac{1}{n}\sum\limits_{k=0}^{n-1}n^{gcd(n,k)}n1k=0∑n−1ngcd(n,k) 式中 gcd(n,k)=dgcd(n,k)=dgcd(n,k)=d 的数量为 ϕ(n/d)\phi(n/d)ϕ(n/d),合并这样的项得到1n∑d∣nϕ(d)nn/d\frac{1}{n}\sum\limits_{d\vert n}\原创 2022-01-09 17:25:34 · 212 阅读 · 0 评论 -
Codeforces 291E KMP + DFS
题意传送门 Codeforces 291E Tree-String Problem题解KMPKMPKMP 构建自动机。将 sis_isi 看作 iii 的点权,DFSDFSDFS 统计即可。总时间复杂度 O(∣t∣+∑∣si∣)O(\lvert t\rvert+\sum\lvert s_i\rvert)O(∣t∣+∑∣si∣)。#include <bits/stdc++.h>using namespace std;#define rep(i, l, r) for (int i =原创 2021-12-15 17:58:27 · 944 阅读 · 0 评论 -
P6843 [BalticOI 2015] DFS
题意传送门 P6843 [BalticOI 2015]File Paths题解将’/'看作目录或文件的前缀,与之相连;从上层目录向其放置的目录或文件连一条边,边代表子节点对应的字符串,那么得到一颗 TrieTrieTrie;仅考虑长度,那么得到一个树形 DAGDAGDAG。问题转化为在一个树形 DAGDAGDAG 中添加至多一条端点非叶子节点的边,求能否找到一条从根节点到各叶子节点的路径,使之权值和为 KKK。考虑’/’,使 SSS 增一。设 ds[u]ds[u]ds[u] 为 root→uroot原创 2021-09-02 23:13:02 · 191 阅读 · 0 评论 -
Codeforces 208E 倍增 + dsu on tree / DFS
题意传送门 Codeforces 208E Blood Cousins题解查询节点的第 ppp 堂兄弟节点的数量,由于它们的第 ppp 父节点相同,那么问题可以转化为父节点的子树信息统计。具体而言,倍增法 O(NlogN)O(N\log N)O(NlogN) 预处理出父节点信息,在各个查询对应的第 ppp 父节点处记录需要进行的查询。dsu on treedsu\ on\ treedsu on tree 维护以 xxx 为根节点的子树中深度为 ddd 的节点原创 2021-07-17 10:49:26 · 127 阅读 · 0 评论 -
POJ 2942 Tarjan v-DCC + 二分图判定
题意传送门 POJ 2942 Knights of the Round Table题解建出补图,即没有仇恨的两个骑士间连边,问题转化为求图中不被任何奇环包含的节点数量。无论是 e−DCCe-DCCe−DCC 或 v−DCCv-DCCv−DCC 都满足在同一环上的两个节点位于相同的双连通分量。否则,将与双连通分量的极大性矛盾。若图中存在奇环,则图不是二分图,可以用 DFSDFSDFS 的染色法判定,但并不能求出所有的奇环。同一个 e−DCCe-DCCe−DCC 中两个不同的环至少存在一个交点;而同一原创 2021-03-17 20:25:00 · 109 阅读 · 0 评论 -
P3645 [APIO2015] 根号分治 + BFS
题意传送门 P3645 [APIO2015]雅加达的摩天楼题解边权为 111 的图,BFSBFSBFS 即可。考虑 dogedogedoge 的状态,为位置与跳跃能力的二元组,用 (b,p)(b,p)(b,p) 表示。若跳跃能力为 ppp,则其可达位置数为 N/pN/pN/p。考虑根号分治。若 p<Np<\sqrt Np<N,状态数至多为 O(NN)O(N\sqrt N)O(NN);若 p≥Np\geq \sqrt Np≥N,状态数至多为 O(MN)O(M\sqrt N)O(原创 2021-03-15 21:39:08 · 169 阅读 · 0 评论 -
P3304 [SDOI2013] 树的直径
题意传送门 P3304 [SDOI2013]直径题解树中最远两点间的距离为树的直径。树上各直径的中点(不一定恰好是某个节点,可能在某条边的内部)是唯一的。DFSDFSDFS 求解某条树的直径,找到直径的中点,即可将各直径划分为两段进行求解。设 cnt[x]cnt[x]cnt[x] 为节点 xxx 的儿子中可以到达直径在这一侧的长度的数量。若直径中点为节点 xxx,当 cnt[x]≥3cnt[x]\geq 3cnt[x]≥3,树的直径无必须边;若直径中点在边 (x,y)(x,y)(x,y) 内部,原创 2021-03-11 20:44:27 · 301 阅读 · 0 评论 -
AcWing 250 BFS + 分块
题意传送门 AcWing 250 磁力块题解将满足 ri∗ri≥(xj−x0)2+(yj−y0)2,pi≥mjr_i*r_i\geq (x_j-x_0)^2+(y_j-y_0)^2,p_i\geq m_jri∗ri≥(xj−x0)2+(yj−y0)2,pi≥mj 的磁石 iii 向磁石 jjj 连一条有向边,以磁石 LLL 为起点进行 BFSBFSBFS,所遍历到的磁石数量(除了 LLL)即答案。朴素的求解每一块磁石能吸引的所有磁石,时间复杂度 O(N2)O(N^2)O(N2)。考虑原创 2021-02-24 09:20:30 · 133 阅读 · 0 评论 -
P3629 [APIO2010] 树的直径 DFS + 树形 DP
题意传送门 P3629 [APIO2010]巡逻题解当 K=0K=0K=0,遍历整棵树,每条边必然被递归依次,回溯一次,故路线总长度为 2×(n−1)2\times (n-1)2×(n−1)。当 K=1K=1K=1,由于新增的边必须正好经过一次,那么由于新增边而构成的环需要遍历一次,则环上的树边经过次数都减少一次,那么目标为最大化环上的树边,那么树的直径即可减小的最大权值。当 K=2K=2K=2,新增的边又构成一个环,若两条新增道路构成的环不重叠,那对于新增的环上的树边贡献依然是 −1-1−1,若原创 2020-12-14 23:14:54 · 124 阅读 · 0 评论 -
P1073 SPFA / BFS
题意传送门 P1073 最优贸易题解求图中顺序经过的两个点 u,vu,vu,v,使 price[v]−price[u]price[v]-price[u]price[v]−price[u] 最大化。SPFA那么在原图求从 111 到节点 vvv 路径上的最小点权 mn[v]mn[v]mn[v],在反图求从节点 NNN 到节点 vvv 路径上的最大点权 mx[v]mx[v]mx[v]。枚举节点 iii,用 mx[i]−mn[i]mx[i]-mn[i]mx[i]−mn[i] 更新答案。SPFASPFAS原创 2020-12-13 20:11:40 · 95 阅读 · 0 评论 -
POJ 1475 双重 BFS
题意传送门 POJ 1475 Pushing Boxes题解如果考虑只有箱子的场景,以坐标 (x,y)(x,y)(x,y) 为状态直接 BFSBFSBFS 即可;本题中还要考虑最小化箱子移动步数的情况下最小化人的步数,那么需要考虑人的位置,进一步扩展状态,以保证遍历搜索树。箱子每一次移动,则人一定位于箱子之前的位置。将相邻的箱子与人看做一个状态,设转移的方向索引为 kkk,那么以 (x,y,k)(x,y,k)(x,y,k) 作为状态进行 BFSBFSBFS。每一次状态出队,枚举可能的 444 个转移原创 2020-12-10 12:02:28 · 301 阅读 · 0 评论 -
POJ 3322 BFS
题意传送门 POJ 3322 Bloxorz I题解长方体当前的状态为其横、纵坐标与摆放状态组成的三元组,为了方便表示,只取长方体左上方的位置作为横、纵坐标状态,BFSBFSBFS 求解即可。#include <algorithm>#include <cstdio>#include <cstring>#include <queue>using namespace std;#define maxn 505struct node{ i原创 2020-12-09 10:01:17 · 147 阅读 · 1 评论 -
POJ 3635 BFS + 优先队列
题意传送门 POJ 3635 Full Tank?题解设当前所在城市为 vvv,所剩汽油为 flflfl,使用二元组 (v,fl)(v,fl)(v,fl) 表示每一个状态。设从起始状态 (s,0)(s,0)(s,0) 达到状态 (v,fl)(v,fl)(v,fl) 的最小花费为 dis[v][fl]dis[v][fl]dis[v][fl],那么有状态转移 {dis[v][fl+1]=min(dis[v][fl+1],dis[v][fl]+pv)fl<cdis[u][fl−d]=min(dis[u原创 2020-12-08 22:08:53 · 870 阅读 · 0 评论 -
P1463 [POI2002][HAOI2007] 因数 + DFS
题意传送门 P1463 [POI2002][HAOI2007]反素数题解答案为 [1,N][1,N][1,N] 中约数个数最多的数中最小的一个。考虑数据范围内 x∈[1,N]x\in [1,N]x∈[1,N] 的约数个数,考虑最小的素数 222,则 xxx 的质因子指数不可能超过 303030;考虑最小的连续素数,则 xxx 的质因数个数不可能超过 999。于是有了搜索范围的初步限制。更进一步的,xxx 为反素数的必要条件是:将 xxx 分解质因数后可写作 2e1×3e2…(e1≥e2⋯≥0)2^{原创 2020-11-24 12:49:09 · 112 阅读 · 0 评论 -
P4151 [WC2011] 线性基 + DFS
题意传送门 P4151 [WC2011]最大XOR和路径题解异或运算和与运算、或运算不同,没有单调性,难以使用一般求最短路的方法求解此问题。考虑环,显然图中环的异或值都是可以取到的。考虑两种情况,环不在路径上,那么可以反复经过某一条通向环的路径,且此路径没有贡献;环在路径上,那么将换上的原路径部分替换为环上非原路径的部分。那么 DFSDFSDFS 求图中所有简单环的异或值,构造线性基。任取一条 1→N1\rightarrow N1→N 的路径,从高位向低位不断尝试异或这一位的线性基,求最大值即可。原创 2020-11-12 10:14:23 · 127 阅读 · 0 评论 -
NC 15665 BFS + 优先队列
题意传送门 NC 15665题解BFS考虑到使用传送阵与向相邻格子移动花费的时间不同,用 两个队列 分别维护使用传送阵与向相邻格子移动的情况,每次按照广度递增出队,更新最短时间。#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <queue>#include <vector>using namespace原创 2020-10-30 16:33:17 · 109 阅读 · 0 评论 -
P3066 [USACO12DEC] DFS + 主席树
题意传送门 P3066 [USACO12DEC]Running Away From the Barn题解考虑从根 DFSDFSDFS 将树表示为序列进行维护。设节点 iii 到根节点的距离为 d[i]d[i]d[i],对于每个节点 uuu 只考虑以其为根的子树上的节点,对于满足条件的点对 (u,v)(u,v)(u,v),其 LCALCALCA 为 uuu,那么 d[v]=d[u]+dist(u,v)d[v]=d[u]+dist(u,v)d[v]=d[u]+dist(u,v)。对于一颗子树,其节点的 D原创 2020-10-25 16:12:01 · 159 阅读 · 0 评论 -
LeeCode 1617 状压 + DFS
题意传送门 LeeCode 1617. 统计子树中城市之间最大距离题解考虑到节点数较少,进行状态压缩然后 O(2n)O(2^n)O(2n) 枚举子集。问题在于如何判断子集对应的节点恰好构成一颗子树,可以 DFSDFSDFS 求解,每次只向在同一个子集中的节点搜索,将状态对应二进制位赋 000,那么假如子集恰好对应一颗子树,则 DFSDFSDFS 结束时状态为 000。子树的最大路径可以在 DFSDFSDFS 的同时求解,对于每一个节点,最大路径的可能值为与根节点的路径或子树中最大的两条路径和。cla原创 2020-10-12 15:58:48 · 146 阅读 · 0 评论 -
P3118 [USACO15JAN] 状压 DP + BFS
题意传送门 P3118 [USACO15JAN]Moovie Mooving题解爆搜至少 O(N!)O(N!)O(N!),考虑状态压缩 DPDPDP。dp[i]dp[i]dp[i] 代表集合 iii 中电影全部的排列能达到的最大 ttt,使 [0,t][0,t][0,t] 都被电影覆盖。dp[i∣1<<j]=max0≤j<N{dp[i∣1<<j],upper_bound(dp[i])+D[j]}dp[i|1<<j]=max_{0\leq j<N}\{d原创 2020-10-10 14:22:13 · 157 阅读 · 0 评论 -
LeeCode 834 DFS
题意传送门 LeeCode 834. 树中距离之和题解枚举根节点 DFSDFSDFS 复杂度 O(n2)O(n^2)O(n2),实际上一次 DFSDFSDFS 已经获取了以各节点为根的子树的信息,利用这些信息进行优化。设 sum[i],num[i]sum[i], num[i]sum[i],num[i] 分别为节点 iii 为根的子树的树中距离和与树中节点个数,则有{sum[i]=∑(sum[ch]+num[ch])\begin{cases}sum[i]=\sum(sum[ch]+num[ch])\原创 2020-10-06 15:04:35 · 77 阅读 · 0 评论 -
LeeCode 1611 DFS
题意传送门 LeeCode 5533. 使整数变为 0 的最少操作次数题解先考虑基本变换,定义 F(i)F(i)F(i) 为使 000 变为 2i2^i2i 或使 2i2^i2i 变为 000 的操作次数,那么需要 F(i−1)F(i-1)F(i−1) 次操作使将 000 变为 2i−12^{i-1}2i−1,将 iii 位异或 111 后,在通过 F(i−1)F(i-1)F(i−1) 次操作使 2i−12^{i-1}2i−1 变为 000。则有{F(i)=2F(i−1)+1F(0)=1\begin原创 2020-10-04 20:22:27 · 143 阅读 · 0 评论 -
AOJ 2212 AC 自动机 + BFS
题意传送门 AOJ 2212题解ACACAC 自动机预处理出迷宫路线对应的字符串的后缀模式。以后缀模式为状态,若状态对应节点或其失配指针指向的节点为禁止模式串,则此状态包含禁止模式。以坐标位置、路线后缀状态为总的状态,BFSBFSBFS 求最短路即可。#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <queue>usi原创 2020-09-18 23:07:59 · 167 阅读 · 0 评论 -
POJ 1985 DFS
题意传送门 POJ 1985题解路径组成一颗树,那么找到度为 111 的节点,以其为根节点 DFSDFSDFS 更新答案,可能的答案为以某个节点为起点的 222 条路径和的最大值。#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <vector>using namespace std;#define maxn 40005原创 2020-09-18 16:37:36 · 161 阅读 · 0 评论 -
POJ 1236 SCC 分解
题意传送门 POJ 1236题解两次 DFSDFSDFS 进行强连通分量分解,并记录其拓扑序。遍历原图,对端点属于不同强连通分量的边在新图进行连边,就实现了将分解后的强连通分量缩成一个顶点,此时得到了一个 DAGDAGDAG(有向无环图)。子任务 AAA 需要发送最少次数以遍历全部学校。对于入度为 000 的点,必须发送一次;DAGDAGDAG 中任一入度非 000 的节点,存在至少一个拓扑序小于这个节点且能到达这个节点的入度为 000 的节点;那么答案即 DAGDAGDAG 入度为 000 的节点原创 2020-09-17 19:32:10 · 239 阅读 · 0 评论 -
LCP 21 拓扑 + BFS
题意传送门 LCP 21. 追逐游戏题解图中存在 NNN 个节点与 NNN 条边,且图连通,那么图中存在一个环。按照求拓扑序的方法,依次删除度为 111 的节点相连的边,最终度大于 111 的节点即在环上。若 AAA 无法追到 BBB,则 BBB 在被追上之前进入环内,且要保证环节点数大于 333(因为每一轮 AAA 先行动)。以 A,BA,BA,B 为起点 BFSBFSBFS,若 BBB 最终被追上,则 BBB 前往任何一个满足 disA[i]<=disB[i]+1disA[i]<=d原创 2020-09-16 19:50:52 · 127 阅读 · 0 评论 -
LCP 20 DFS
题意传送门 LCP 20. 快速公交 题解前向 DFSDFSDFS 状态数显然过多;考虑后向 DFSDFSDFS,从终点搜索至起点。对于某个位置 xxx,有 333 种可能的花费最小的方式到达:直接从起点移动至 xxx;从 x/jump[i]x/jump[i]x/jump[i] 位置做公交至 x/jump[i]×jump[i]x/jump[i]\times jump[i]x/jump[i]×jump[i] 再向前动至 xxx;从 x/jump[i]+1x/jump[i]+1x/jump[i]+1 位置原创 2020-09-14 16:05:53 · 94 阅读 · 0 评论 -
LeeCode 130 DFS
题意传送门 LeeCode 130. 被围绕的区域题解从矩形区域边界 dfsdfsdfs,标记所有可保留的 ′O′'O'′O′;然后遍历区域元素,将标记的 ′O′'O'′O′ 保留,其余赋为 ′X′'X'′X′。class Solution{public: int n, m, dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1}; void dfs(int x, int y, vector<vector<char>> &原创 2020-08-11 10:41:24 · 96 阅读 · 0 评论 -
LeeCode 93 DFS
题意传送门 LeeCode 93. 复原IP地址题解搜索 IPIPIP 地址的 333 个 ′.′'.'′.′ 位置,判断合法性即可。class Solution{public: int n; vector<string> res; bool judge(string &s, int l, int r) { if (l < r && s[l] == '0') { re原创 2020-08-09 16:28:10 · 125 阅读 · 0 评论 -
LCP 09 BFS
题意传送门 LCP 09. 最小跳跃次数题解观察状态转移,建图并非 DAGDAGDAG,考虑图论。由于只求最小边数,BFSBFSBFS 即可。class Solution{public: int minJump(vector<int> &jump) { int n = jump.size(), lb = 0; vector<int> d(n + 1, INT_MAX); queue<int>原创 2020-07-13 23:09:17 · 149 阅读 · 0 评论 -
NC 14545 DFS + DP
题意传送门 NC 14545题解DFSDFSDFS 求节点 111 的所有连通节点,DPDPDP 求解背包问题。#include <bits/stdc++.h>using namespace std;#define maxn 10005#define maxc 505typedef long long ll;int N, M, C, a[maxn], b[maxn], used[maxn], dp[maxc];vector<int> G[maxn], net;原创 2020-07-04 11:54:04 · 1033 阅读 · 0 评论 -
LeeCode 10 DFS / DP
题意传送门 LeeCode 10. 正则表达式匹配题解对于 ′a−z′'a-z'′a−z′ 与 ′.′'.'′.′ 只需判断字符串 sss 与字符规律 ppp 的当前字符是否匹配,若匹配成功 s,ps,ps,p 指针移动至下一位置匹配后续字符;反之,匹配失败。考虑到 ′∗′'*'′∗′ 匹配零个或多个前面的那一个元素,则若 ppp 当前匹配字符的下一字符为 ′∗′'*'′∗′,则可以匹配或不匹配当前字符,根据回溯结果判断匹配结果。class Solution{public: bool原创 2020-06-23 11:31:37 · 100 阅读 · 0 评论 -
LeeCode 124 DFS
题意传送门 LeeCode 124. 二叉树中的最大路径和题解对于二叉树的最大路径,dfsdfsdfs 深度相同的节点最多只有 222 个,且 dfsdfsdfs 深度最小的节点只有 111 个。对于每一个节点,最大路径和可能出现在包含此节点且此节点 dfsdfsdfs 深度最小的路径,或包含此节点但此节点 dfsdfsdfs 深度并非最小的路径。那么对于第一种情况,用节点的值加上左右子树的没有相同 dfsdfsdfs 深度节点的最大路径和,以更新答案;对于第二种情况,将左右子树中,没有相同 dfs原创 2020-06-21 13:24:59 · 141 阅读 · 1 评论 -
LeeCode 1028 dfs
题意传送门 LeeCode 1028. 从先序遍历还原二叉树题解设当前深度为 depdepdep,SSS 的下一个节点深度为 nxtDepnxtDepnxtDep。dfsdfsdfs 重构当前根节点,同时维护 SSS 的指针位置。对于满足 dep>nxtDepdep>nxtDepdep>nxtDep 的情况,重构左子树;反之,SSS 的指针回退,搜索回溯。右子树同理。class Solution {public: int pos; TreeNode* dfs(in原创 2020-06-18 10:27:31 · 219 阅读 · 0 评论 -
POJ 3333 dfs / 最小费用流
题意传送门 POJ 3333题解对于 dc[v]≤vdc[v]\leq vdc[v]≤v 的 vvv,在未访问过时选择 tricktricktrick 显然是最优的;反之,需要搜索 tricktricktrick 与 normalnormalnormal 两种走法(如果数据不水复杂度是要爆的)。#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>using原创 2020-06-17 22:28:07 · 231 阅读 · 0 评论 -
LeeCode 297 dfs
题意传送门 LeeCode 297. 二叉树的序列化与反序列化题解当二叉树节点的值不相同时,可以根据前序遍历/后序遍历与中序遍历重构二叉树。为了保证节点各不相同,用 dfsdfsdfs 序唯一标识节点值,同时维护节点原值。设 dfsdfsdfs 序为 ididid,节点值为 valvalval,序列化为 [id,val][id,val][id,val],实现上用栈解析序列。重构二叉树的基本思想是前序遍历/后序遍历的第一个/最后一个值为根节点的值,在中序遍历中找到根节点所在位置,就可以将前序遍历/后原创 2020-06-16 22:52:03 · 130 阅读 · 0 评论 -
LeeCode 802 dfs
题意传送门 LeeCode 802. 找到最终的安全状态题解有向图中,若节点能走到圈中,则不是安全节点;反之,则是安全节点。那么 dfsdfsdfs 时,除了维护访问过的节点,同时维护节点是否为安全节点,将不能走到圈的节点加入答案即可。class Solution{public: vector<int> res; vector<bool> used, label; bool dfs(int u, vector<vector<int>原创 2020-06-10 21:12:56 · 120 阅读 · 0 评论 -
LeeCode 126 bfs
题意传送门 LeeCode 126. 单词接龙 II题解求从 beginWordbeginWordbeginWord 到 endWordendWordendWord 的最短转换序列。class Solution{public: vector<vector<string>> findLadders(string beginWord, string endWord, vector<string> &wordList) { i原创 2020-06-07 16:40:43 · 107 阅读 · 0 评论 -
LeeCode 面试题29 dfs
题意传送门 面试题29. 顺时针打印矩阵题解构造一个顺时针方向的正方形边向量,观察到打印的下一个方向决定于前一个方向以及位置是否合法。dv={[0,1],[1,0],[0,−1],[−1,0]}dv=\{[0,1],[1,0],[0,-1],[-1,0]\}dv={[0,1],[1,0],[0,−1],[−1,0]}设上一次打印方向为 preprepre 则下一次打印方向应该按 (pre+0)%4,…,(pre+4)(pre+0)\%4,\dots,(pre+4)%4(pre+0)%4,…,(pr原创 2020-06-05 08:33:04 · 143 阅读 · 0 评论