DFS
酷酷的Herio
这个作者很懒,什么都没留下…
展开
-
使用Fisher-Yates 洗牌算法实现random_shuffle函数
使用Fisher-Yates 洗牌算法实现random_shuffle函数class Solution {public: Solution(vector<int>& nums) { this->nums = nums; this->original.resize(nums.size()); copy(nums.begin(), nums.end(), original.begin()); }原创 2021-11-22 10:37:24 · 517 阅读 · 0 评论 -
有向图求最小环
文章目录有向图求最小环方法1floyd方法2dijkstra方法3tarjan方法4 拓扑排序方法5 并查集求环有向图求最小环方法1floyd三重循环扫一遍,然后rep(i,1,n){ if(d[i][i]==inf) continue; ans=min(ans,d[i][i]);}时间复杂度:O(n3)O(n^3)O(n3)方法2dijkstra对每个结点dijkstradijkstradijkstra一次。思想与floydfloydfloyd类似。时间复杂度:O(n(n原创 2021-11-19 13:48:34 · 2642 阅读 · 0 评论 -
今日搜索训练(4.15)
今日搜索训练(4.15)传送门CF580C Kefa and Park大水题,dfs维护两个变量,当前连续的1和最大1的个数。唯一需要注意的是判断叶子,即size=1,且非根的点。codevoid dfs(int u,int fa,int s,int mx){ int f=SZ(e[u]); //printf("%d %d %d %d %d\n",u,fa,s,mx,f); for(int v:e[u]){ if(v==fa) continue; dfs(v,u,!a[v]?0:s原创 2021-04-15 21:04:53 · 290 阅读 · 0 评论 -
P1021 [NOIP1999 提高组] 邮票面值设计(dfs&dp)
P1021 [NOIP1999 提高组] 邮票面值设计(dfs&dp)好题!和ICPC昆明的一道主席树思想相同。思路:先利用dp找到f[i]f[i]f[i]表示到达面值iii所需的最小邮票数。具体地,转移方程是:f[i]=min(f[i],f[i−a[i]]+1)f[i]=min(f[i],f[i-a[i]]+1)f[i]=min(f[i],f[i−a[i]]+1)。当f[i]>nf[i]>nf[i]>n就breakbreakbreak掉,i−−i--i−−。此时的能表示原创 2021-04-13 21:30:01 · 415 阅读 · 0 评论 -
P2993 [FJOI2014]最短路径树问题(dijkstra&点分治)
P2993 [FJOI2014]最短路径树问题(dijkstra&点分治)思路part1跑dijkstra,然后对边排序,建立最短路生成树MPTpart2裸的点分治,每次预处理一个子树的路径长度和边数,然后用两个边数桶维护 (路径长,路径个数)两个变量即可。时间复杂度:O(mlogn+nlog2n)O(mlogn+nlog^2n)O(mlogn+nlog2n)code#include<bits/stdc++.h>using namespace std;typedef原创 2021-04-01 17:40:23 · 308 阅读 · 0 评论 -
P2934 [USACO09JAN]Safe Travel G(并查集&最短路树)
P2934 [USACO09JAN]Safe Travel G(并查集&最短路树)思路一个图的最短路中每个结点最后更新的边可以组成一个最短路生成树。由题目条件可知,我们要寻找每个结点不经过该父亲边的一条最短路。考虑对于当前结点iii先经过其子树的一个结点uuu,然后经过非树边u→vu\rightarrow vu→v,然后从v→1v\rightarrow 1v→1。这样计算的答案是:du+dv+wu,v−did_u+d_v+w_{u,v}-d_idu+dv+wu,v−di,注意到前面原创 2021-04-01 15:54:01 · 318 阅读 · 0 评论 -
Earthquake Damage(贪心&dfs)
Earthquake Damage(贪心&dfs)思路考虑每个不可通过点的的相连点,显然只有两种情况:要么也是不可通过点,要么是被破坏点。如果是不可通过点的话,那么它的相邻点也不可到达1,如果是被破坏点,则它的相邻点有可能到达1。所以贪心地考虑,将每个不可通过点的周围都设为被破坏点。时间复杂度:O(n+m)O(n+m)O(n+m)code// Problem: Earthquake Damage// Contest: NowCoder// URL: https://ac.nowc原创 2021-04-01 15:45:12 · 263 阅读 · 0 评论 -
D - Hanjo(dfs&状压)
D - Hanjo(dfs&状压)状压+爆搜的好题,我好菜,看代码应该就能看懂。下面的代码,还强烈体现了运算符优先级。code// Problem: D - Hanjo// Contest: AtCoder - AtCoder Beginner Contest 196// URL: https://atcoder.jp/contests/abc196/tasks/abc196_d// Memory Limit: 1024 MB// Time Limit: 2000 ms// Dat原创 2021-03-21 23:28:30 · 374 阅读 · 1 评论 -
欧拉路径问题
欧拉路径问题P1127 词链欧拉通路+输出路径 O(n+m)O(n+m)O(n+m)注意输出路径要先dfsdfsdfs,再把边入栈。不能先入栈再dfs,因为dfs(v)dfs(v)dfs(v)不能搜了,而uuu的儿子可以继续搜。比如ac,ca,abac,ca,abac,ca,ab 边排序后是ab,ac,caab,ac,caab,ac,ca,dfs会先搜ababab,但此时我们的答案的第一个不是ababab,而是acacac,也就是我们要把每个结点能搜的点都加入答案之后再加入它。P1333原创 2021-03-19 22:53:57 · 630 阅读 · 0 评论 -
P1013 [NOIP1998 提高组] 进制位(dfs)
P1013 [NOIP1998 提高组] 进制位(dfs)迷惑题意。真实题意是给定nnn行字符串,左上角是+,且a[1][i]=a[i][1]a[1][i]=a[i][1]a[1][i]=a[i][1] 都是一个字母,判断是否满足加法表。根据题意,我们知道答案存在当且仅当为n−1n-1n−1进制,因为除了+++之外,第一行或第一列都有n−1n-1n−1个不同的字母代表不同的数。所以我们就全排列n−1n-1n−1个字母对应的数字[0,n−2][0,n-2][0,n−2],然后对于a[i][j]a[i]原创 2021-03-18 14:43:45 · 492 阅读 · 0 评论 -
A.Odd degrees(dfs)
A.Odd degrees(dfs)思路直接考虑边的选择不好考虑,转化为树上问题,假设我们已经知道一个结点的所有儿子结点的度数,对于结点uuu,如果儿子结点vvv的度数为奇数,则边(u,v)(u,v)(u,v)要删掉,否则该边要保留,正确性是因为儿子节点除了与父亲相连的边之前没计算,其他边都计算了,所以只用考虑(u,v)(u,v)(u,v)选不选即可。code// Problem: Odd degrees// Contest: NowCoder// URL: https://ac.nowcode原创 2021-03-07 10:47:57 · 410 阅读 · 0 评论 -
1718. 构建字典序最大的可行序列(启发式回溯&DFS)
1718. 构建字典序最大的可行序列(启发式回溯&DFS)看代码好了,剪枝很重要。class Solution {public: vector<int>ans,a,vis; bool dfs(int x,int n){ if(x==2*n-1){ ans=a; return true; } if(a[x]>0) return dfs(x+1,n);原创 2021-01-11 17:39:27 · 334 阅读 · 0 评论 -
F - +1-1x2 (记忆化搜索)
F - +1-1x2 (记忆化搜索)之前牛客做过的一道类似的题。传送门+1,−1,+1,-1,+1,−1,开根号三个操作。const int N=2500;class Solution {public: /** * 返回最后要输出的答案 * @param n int整型 表示牛牛的数字 * @param m int整型 表示牛妹的数字 * @return int整型 */ int dp[N]; int y; in原创 2021-01-10 23:46:15 · 459 阅读 · 0 评论 -
LC.5639. 完成所有工作的最短时间(dfs&状压dp)
LC.5639. 完成所有工作的最短时间(dfs&状压dp)LCLCLC打到一半,最后一题都没做完,叫人修宽带去了,家里的网有点头疼。1.爆搜+剪枝,用两个变量a,c表示当前搜到第几个工作,和当前情况的最大值,分两种情况,加入到已经有的集合和新创建一个集合。class Solution {public: vector<int>tm,w; int ans,k1; int minimumTimeRequired(vector<int>& j原创 2021-01-10 14:10:19 · 294 阅读 · 1 评论 -
The Pilots Brothers‘ refrigerator (DFS&思维)
The Pilots Brothers’ refrigerator (DFS&思维)思路1:与POJ−1753POJ-1753POJ−1753类似,位运算dfsdfsdfs搜,不过容易超时。#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<vector>using namespace std;typedef long lo原创 2020-10-19 13:40:21 · 477 阅读 · 1 评论 -
Flip Game POJ-1753 (位运算&DFS)
Flip Game POJ-1753 (位运算&DFS)传送门思路:每个位置至多翻转一次,一开始我以为在位置AAA翻一次,然后进行其他影响AAA的操作,再翻转AAA的操作是对AAA的贡献有影响的,但是仔细想想,只要翻转AAA的相邻位置,AAA也会进行相应翻转,所以AAA翻转两次最后等于没翻转。所以可以考虑暴力2162^{16}216位运算。或者贪心步数从小到dfsdfsdfs。位运算:#include<iostream>#include<cstdio>#inc原创 2020-10-19 12:46:15 · 389 阅读 · 0 评论 -
Codeforces Round #387 (Div. 2) E. Comments (dfs)
Codeforces Round #387 (Div. 2) E. Comments (dfs)思路:按树的深度进行dfsdfsdfs即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e6+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a,b) memset(a,b,sizeof a)#define lx x<<1原创 2020-10-18 10:28:51 · 1725 阅读 · 4 评论 -
2018蓝桥杯省赛第九题:全球变暖
2018蓝桥杯省赛第九题:全球变暖思路: dfsdfsdfs,先找出所有陆地连通块,然后不同的陆地都给予一个不同的标记数字,相同的陆地格子标记相同的数字,dfsdfsdfs的过程中同时记录被淹没的格子,然后将这些格子修改掉,最后再统计有多少个不同的数字即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;原创 2020-10-15 17:16:52 · 326 阅读 · 0 评论 -
1064 Complete Binary Search Tree (BST&CBT)
1064 Complete Binary Search Tree (BST&CBT)思路:dfsdfsdfs,因为BSTBSTBST的中序遍历是非递减序,而CBT(Complete Binary Tree)CBT(Complete\ Binary \ Tree)CBT(Complete Binary Tree) 是完全二叉搜索树,记rootrootroot为编号000。左儿子为:root×2+1root\times 2+1root×2+1。右儿子为:ro原创 2020-10-12 20:43:13 · 356 阅读 · 0 评论 -
1053 Path of Equal Weight (DFS)
1053 Path of Equal Weight (DFS)思路:dfsdfsdfs,因为要递减序输出,所以考虑存儿子结点的时候按权值从大到小存,然后跑dfsdfsdfs即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=105,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a,b) memset(a,b,sizeof a)#def原创 2020-10-09 13:09:13 · 252 阅读 · 0 评论 -
1043 Is It a Binary Search Tree
1043 Is It a Binary Search Tree思路:dfsdfsdfs。由BSTBSTBST性质和前序遍历可以推出后序遍历,然后用一个数组存后序遍历,判断一下是否为nnn个元素。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a,b) memset(a,b,siz原创 2020-10-06 17:47:29 · 302 阅读 · 0 评论 -
字符串全排列(DFS)
字符串全排列(DFS)1.不去重写法。思路:一个数组vis[]vis[]vis[]标记位置,然后跑dfsdfsdfs。#include<bits/stdc++.h>using namespace std;typedef long long ll;#define pb push_backchar a[25],b[25];int n,vis[25];void dfs(int p){ if(p==n){ b[n]='\0'; cout<<b<<end原创 2020-09-26 17:45:11 · 889 阅读 · 3 评论 -
拜托了,牛老师(DFS)
拜托了,牛老师(DFS)思路:dfsdfsdfs,因为nnn最大只有1e61e61e6,考虑因数最多只有两百多,因为要求因数不同,可以考虑以递增顺序剪枝dfsdfsdfs。时间复杂度:O(kn)O(k\sqrt{n})O(kn)#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a原创 2020-08-26 20:30:37 · 354 阅读 · 0 评论 -
D. Maximum Distributed Tree(DFS)
D. Maximum Distributed Tree(DFS)思路:dfsdfsdfs讨论一下mmm与n−1n-1n−1的大小关系,然后计算每条边的贡献次数排序即可。没想到最后因为数组开小了一直没ACACAC,气死了。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+5,M=6e4+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a,b) m原创 2020-08-22 09:02:09 · 432 阅读 · 0 评论 -
LC.529. 扫雷游戏(DFS)
LC.529. 扫雷游戏(DFS)思路:dfsdfsdfs即可,需要注意的是这里的相邻是888连通。class Solution {public: int sx,sy,vis[55][55],n,m; //int d[4][2]={0,1,0,-1,1,0,-1,0}; int d[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,-1,-1,1}; bool jg(int x,int y){ return x>=0&原创 2020-08-20 10:29:06 · 339 阅读 · 0 评论 -
MMSet2(LCA&树的直径)
MMSet2(LCA&树的直径)思路:树的直径,结论:一棵树的任意点集SSS中距离最远的两个点(类似树的直径)必有一个点是深度最大的点,且树上所有点的到该节点距离最大值的最小值为:该点集的直径除以2向上取整。因为:所有点的f(u)f(u)f(u)都是与该点集直径d(x,y)d(x,y)d(x,y)到这两个点的距离取mxmxmx,所以要找到最小的值,只需要mx+12\dfrac{mx+1}{2}2mx+1,这样肯定是最小的,其他的都会大于距离的一半。ep:mx=d(x,y)=5,ep:mx=d原创 2020-08-18 13:12:41 · 390 阅读 · 0 评论 -
LC.110.平衡二叉树
LC.110.平衡二叉树思路:dfsdfsdfs判断高度差即可。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:原创 2020-08-17 08:18:50 · 314 阅读 · 0 评论 -
LC.133. 克隆图(DFS)
133. 克隆图思路:图的深拷贝,dfsdfsdfs即可,需要注意的是无向图可能重复建立新结点,所以需要标记一下,每个结点的对应的拷贝结点。/*// Definition for a Node.class Node {public: int val; vector<Node*> neighbors; Node() { val = 0; neighbors = vector<Node*>(); }原创 2020-08-12 10:29:22 · 327 阅读 · 0 评论 -
LC.130.被围绕的区域(DFS)
LC.130.被围绕的区域(DFS)思路:将边界上的连通OOO区域跑dfsdfsdfs标记,再对未标记的OOO修改即可。class Solution {public: vector<vector<int> >vis; int d[4][2]={0,1,0,-1,1,0,-1,0}; int n,m; void dfs(vector<vector<char>>& a,int x,int y){ vi原创 2020-08-11 12:07:41 · 302 阅读 · 0 评论 -
LC.93.复原IP地址(简单DFS)
LC.93.复原IP地址(简单DFS)思路:简单dfsdfsdfs,注意特殊情况,前导000即可。class Solution {public: vector<string>ans; string s; int n; void dfs(string c,int p,int cnt){ //cout<<"c="<<c<<" p="<<p<<" cnt="<<cnt<&原创 2020-08-09 11:25:05 · 372 阅读 · 0 评论 -
The Flee Plan of Groundhog(DFS)
The Flee Plan of Groundhog(DFS)思路:因为nnn到每个点所有时间一定,考虑以nnn为根dfsdfsdfs,求每个点到nnn的距离d[i]d[i]d[i]并求出每个结点的fa[i]fa[i]fa[i],然后找到ttt秒后OrangeOrangeOrange的位置sss,然后再从sss开始dfsdfsdfs一遍取答案的最大值,再与d[s]d[s]d[s]取较小值。因为时间最大不能超过d[s]d[s]d[s],这表示sss在到达目的地的途中被抓了。否则取sss所有能到达的目的原创 2020-08-08 18:32:06 · 709 阅读 · 15 评论 -
LC.99.恢复二叉搜索树(中序遍历)
LC.99.恢复二叉搜索树(中序遍历)思路:中序遍历+dfs+dfs+dfs.因为二叉搜索树的中序遍历是递增序列,所以只需找到相邻的逆序对位置,可能是一对,或者两对。可以先转化序列找到位置在到树中修改。或者dfsdfsdfs递归修改。显式修改:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *原创 2020-08-08 09:27:23 · 419 阅读 · 0 评论 -
F - Forest Program(DFS)
F - Forest Program(DFS)思路:经典的图论题。每个环的贡献是:2x−12^{x}-12x−1,xxx为环的边数。每个非环边的贡献是:222,一共2m−cnt2^{m-cnt}2m−cnt,mmm为总边数,cntcntcnt为环的边数和。然后跑dfsdfsdfs即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=3e5+5,M=2e4+5,inf=0x3f3原创 2020-08-07 10:04:52 · 570 阅读 · 0 评论 -
LC.337. 打家劫舍 III(树形DP&递归)
LC.337. 打家劫舍 III(树形DP&递归)思路:树形dpdpdp+递归。1.考虑考虑某个结点选或不选的的子树最大值为f(x),g(x)f(x),g(x)f(x),g(x)若选xxx,则f(x)=g(lson)+g(rson)f(x)=g(lson)+g(rson)f(x)=g(lson)+g(rson)若不选xxx,则g(x)=max(f(lson),g(lson))+max(f(lson),g(lson))g(x)=max(f(lson),g(lson))+max(f(lson),原创 2020-08-05 09:51:51 · 366 阅读 · 0 评论 -
LC.207.课程表(拓扑排序)
LC.207.课程表(拓扑排序)思路:拓扑排序。1.dfsdfsdfs解法:class Solution {public: vector<vector<int> >e; vector<int>vis;//(0:未搜的点 1:正在搜的点 2:已经搜完的点) bool ok; void dfs(int u){ vis[u]=1; for(int v:e[u]){ if(!vis[v原创 2020-08-04 08:44:48 · 447 阅读 · 0 评论 -
Interesting Computer Game(DFS||并查集)
Interesting Computer Game(DFS||并查集)思路:转化为连通子图G<V,E>G<V,E>G<V,E>的顶点数之和,若无环贡献为顶点数,否则为顶点数减1.dfsdfsdfs做法#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;#define ms原创 2020-08-03 19:44:08 · 1056 阅读 · 0 评论 -
D. Captain Flint and Treasure(DFS&贪心)
D. Captain Flint and Treasure(DFS&贪心)思路:dfs+dfs+dfs+贪心。考虑:将b[i]→ib[i]\rightarrow ib[i]→i作为一条有向边,建图。先从b[i]==−1b[i]==-1b[i]==−1的点开始dfsdfsdfs,因为它不会再对其他点产生贡献,只有其他点会对它产生贡献,因为dfsdfsdfs的特性,我们会优先将a[i]≥0a[i]\geq0a[i]≥0的叶子节点加入一个数组ccc,这样对于其他结点的收益是最大的,对于a[i]<原创 2020-07-31 10:05:37 · 1373 阅读 · 0 评论 -
C. Uncle Bogdan and Country Happiness(DFS)
C. Uncle Bogdan and Country Happiness(DFS)思路:dfsdfsdfs。设经过城市iii的好人为:g[i]g[i]g[i],拜访城市iii的总人数为:a[i]a[i]a[i]主要是找到g[i]g[i]g[i]的表达式,这题就解决了。根据:g[i]−(a[i]−g[i])=h[i]→g[i]=a[i]+h[i]2g[i]-(a[i]-g[i])=h[i]\rightarrow g[i]=\dfrac{a[i]+h[i]}{2}g[i]−(a[i]−g[i])=h[原创 2020-07-31 09:22:41 · 540 阅读 · 0 评论 -
LC.104.二叉树的最大深度(DFS&BFS)
LC.104.二叉树的最大深度(DFS&BFS)思路:dfsdfsdfs或bfsbfsbfs。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class S原创 2020-07-28 11:28:32 · 344 阅读 · 0 评论 -
LC.95.不同的二叉搜索树 II(递归)
LC.95.不同的二叉搜索树 II(递归)思路:递归实现,考虑枚举根结点,递归左右子树,然后从左子树的答案和右子树的答案选一个合并丢进ansansans里即可。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right原创 2020-07-21 07:55:35 · 314 阅读 · 0 评论