![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DFS
超级码力奥
这个作者很懒,什么都没留下…
展开
-
Acwing1072 树的最长路径(树的直径)树形Dp 记忆化搜索
原题链接: https://www.acwing.com/problem/content/1074/以下针对树的边权都一样的情况。推荐使用BFS, 比赛的时候栈空间只有1MB,DFS太深可能会爆战。使用反证法证明:u是距离a最远的点,bc是树的直径。有两种情况:au和bc有交点。有交点x的话,由于u是距离a最远的点,则xu>xc, 即bu>bc。但是,由于bc是树的直径,bc是最长的,bc应该大于bu。矛盾。au和bc没交点。由于这是树,所以两条直线一定是联通的。假设从x连到原创 2022-03-07 08:59:07 · 207 阅读 · 0 评论 -
LeetCode 6150. 根据模式串构造最小数字 DFS全排列+贪心
贪心+全排列暴力原创 2022-08-15 15:30:16 · 345 阅读 · 0 评论 -
LeetCode 22. 括号生成 动态规划或者递归
动态规划+DFS原创 2022-08-12 20:14:32 · 230 阅读 · 0 评论 -
剑指offer:矩阵中的路径
原题链接:https://www.acwing.com/problem/content/21/class Solution {public: bool hasPath(vector<vector<char>>& matrix, string &str) { for(int i = 0; i < matrix.size(); i ++) for(int j = 0; j < matrix原创 2022-04-06 09:19:46 · 106 阅读 · 0 评论 -
染色法判定二分图:BFS+DFS版本
染色法将所有点分成两个集合,使得所有边只出现在集合之间,就是二分图二分图:一定不含有奇数环,可能包含长度为偶数的环, 不一定是连通图dfs(起点)dfs (u,c)函数:对当前点u进行染色,染成c色遍历u的所有临边,对于每个临边:如果被染过色且染的还是c,返回false如果没有被染过:尝试对这个点使用c之外的另一种颜色染色,如果染色失败,返回false返回染色成功。#include<cstring>#include<iostream&g.原创 2022-03-13 10:35:41 · 485 阅读 · 0 评论 -
Acwing42场周赛:搜索 贪心:满二叉树等长路径
原题链接:https://www.acwing.com/problem/content/4316/从下往上,依次处理每个子树,对于每个子树,res += 这个子树的左右子树到叶节点最长路径的差的绝对值。每个子树处理好了,上边的自然也就好了啦。#include<iostream>#include<cmath>#include<algorithm>using namespace std;const int N = 2050;int a[N];int r原创 2022-03-13 09:24:48 · 1757 阅读 · 0 评论 -
DFS+优化搜索顺序+剪枝+状态压缩:数独
原题链接:https://www.acwing.com/problem/content/description/168/由于数据保证有解,并且只有一个解,所以搜索顺序很重要。每次优先搜索可选的数最少的进行搜索。思路:对于每一行,每一列,每个小的九宫格,记录三个二进制状态,表示哪些数可以用,哪些数还不可以用。对于所有的点,每次选一个可选1最少的点,进行填充。行、列和小九宫格三个状态相与,就可以知道这个点可以选什么。然后选一个,修改现场,继续DFS,然后恢复现场…可以预处理,加快速度。比如对于每个原创 2022-03-10 21:28:45 · 283 阅读 · 0 评论 -
DFS+搜索顺序优化:小猫爬山 和分成互质的数组一样
剪枝策略:原创 2022-03-10 20:58:51 · 113 阅读 · 0 评论 -
DFS:分成互质组
原题链接:https://www.acwing.com/problem/content/1120/扩展选择:已存在的组+每次尝试开辟一个新的组参考的代码比y总快20倍:#include <iostream>#include <vector>#include <algorithm>using namespace std;const int N = 15;vector<int> g[N]; // 开的存放互质的数的数组int nums[N];原创 2022-03-09 10:51:17 · 153 阅读 · 0 评论 -
DFS+回溯:单词接龙
原题链接:https://www.acwing.com/problem/content/1119//* g[i][j] 第i个字符串和第j个字符串之间的最小公共长度 方便再DFS扩展的时候使用*/#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 21;int n;string word[N];i原创 2022-03-09 10:04:13 · 89 阅读 · 0 评论 -
DFS+回溯:马走日
原题链接:https://www.acwing.com/problem/content/description/1118/看成一颗每个节点都有8个子节点的树,需要回溯的。DFS具体怎么写,和你的定义有关系。就按照你DFS的意义写。这是我写的:# include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 10;bool g[N][N];原创 2022-03-09 09:21:23 · 86 阅读 · 0 评论 -
Flood-Fill: 使用DFS 使用BFS也可以
#include<iostream>#include<cstring>using namespace std;const int N=30;char g[N][N];int n,m,cnt;int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};void dfs(int x,int y){ g[x][y]='#'; cnt++; for(int i=0;i<4;i++) { int a.原创 2022-03-09 08:34:04 · 65 阅读 · 0 评论 -
DFS: 迷宫 简单的DFS
#include<iostream>#include<cstring>using namespace std;const int N=110;int n, k;char g[N][N];bool st[N][N];int xa, ya, xb, yb;int dx[]={-1, 0, 1, 0}, dy[]={0, 1, 0, -1};bool dfs(int x, int y){ if(g[x][y]=='#') return false;.原创 2022-03-09 08:33:26 · 131 阅读 · 0 评论