![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DFS
HT008_123
家人们点点关注叭
展开
-
[ACM刷题] DP数论专题
A: 求B对P的逆元就好了www #include <iostream> #include <cstdio> #define int long long const int mod=9973; int inv,p,s; int exgcd(int a,int b,int &x,int &y) { if(!b) { x=1; ...原创 2019-07-23 10:36:12 · 278 阅读 · 0 评论 -
HDU 2485 Destroying the bus stations(迭代加深搜索)
题目链接 题目大意 给你N个点M条边和一个参数K 问你最少删除几个点可以让1-n的最短路径>K 解题思路 首先,我们删除的点一定是在当前图上1-n最短路径上的点,否则没有意义。 N 问题的难点在于我们没法确定到底删几个点和那几个点。 删除几个点这样有层次的问题,我们可以使用迭代加深搜索。 迭代加深搜索 所谓迭代加深搜索,即将深搜限制在一定的层数下的深搜。 基本的深搜原创 2018-01-16 09:34:11 · 221 阅读 · 0 评论 -
Tarjan求LCA
我对Tarjan越来越崇拜了! 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点。 换句话说,就是两个点在这棵树上距离最近的公共祖先节点。 所以LCA主要是用来处理当两个点仅有唯一一条确定的最短路径时的路径。 有人可能会问:那他本身或者其父亲节点是否可以作为祖先节点呢原创 2017-10-16 15:26:47 · 337 阅读 · 0 评论 -
运输计划
题目链接 暴力分: 贪心20,不写了。 正解:二分 二分最短的时间。 通过预处理求出每条航线的总时间。 二分一个时间。 是否存在一条边,减下它的时间让所有的大于mid的路,全部小于mid。 如何找一条被重复经过的边? 树上差分。 对于数组v V[起点,终点]+1,V[lca(起点,终点)]-=2 从i到他的父节点的路径被经过的次数即为i子树v的和。 注意要用T原创 2017-10-23 16:52:01 · 260 阅读 · 0 评论 -
NOIP2017 D2 T2 宝藏
做数据结构的题目有点恶心。 于是来做做NOIP没A掉的题目。 想起考场上写的状压来了,仔细想了想,猛地发现我的解法好像已经接近正解了。但是考场上放弃了状压,写了最小生成树~ 不知道官方的正解是个啥,不过 状压+记忆化搜索确实可以A掉此题 上面是一个二维DP! 下面是记忆化搜索! 遗憾。#include <cstdio> #include <iostream> #include <cs原创 2018-01-03 19:56:52 · 788 阅读 · 3 评论 -
P2066 机器分配
传送门 dp[i][j]表示第i个公司用了j台最大的价值。 i-1的已知 dp[i][j]=max(dp[i-1][k]+map[i][m-k]). 问题是咋输出,跟上面的方式一样,去找能求出最大值的,递归输出即可。#include <cstdio> #include <iostream> using namespace std; int map[30][30]; int dp[30][30原创 2017-10-26 07:53:35 · 201 阅读 · 0 评论 -
大奖赛+秘密信息
30爆搜,60 01背包,100折半搜索。#include <cstdio> #include <iostream> #include <algorithm> #define ll long long using namespace std; ll a[50],b[50]; ll n,k,t,w; ll f[9999999],cnt,ans; void dfs1(ll x,ll c) {原创 2017-10-23 11:09:16 · 207 阅读 · 0 评论 -
数列+车辆销售
这就是更相减损之术。 直接模拟太慢。 搞成辗转相除。 对于a,b不一样的数的个数为a/b 然后按求GCD的方法递归下去#include <cstdio> #include <iostream> #include <cstring> #define ll long long using namespace std; ll ans=0; ll abs(ll x) { if(x<0原创 2017-11-02 16:48:27 · 230 阅读 · 0 评论 -
P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
题目描述 : 给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积 思路: 迭代加深搜索+贪心 首先我们计算出所以东西的总和,最少需要 sum/max_w个组。 然后迭代加深搜索即可 小剪枝 先排大的牛,在排小的。 搜索0msAC,还是比较强的。 代码: #include #include #include #define ll long long usi原创 2018-01-20 10:41:37 · 562 阅读 · 0 评论 -
[SDOI 2015] 排序
题目描述: 语死早,描述不出来TAT. 题目分析: 对于任何一个操作序列,操作顺序不影响最后结果 所以当K次操作可以成功的时候 贡献即为 K! 我们从小到大DFS,对于第i次操作我们将序列分成2n−i2n−i2^{n-i}段,每段长度2i2i2^i 我$们找到序列中不是连续递增的段,如果这样的段超过2个,显然这种情况无法使之合法 如果没有这样的段,就不需要执行这个操作 如果有一个这...原创 2018-03-10 09:05:34 · 284 阅读 · 0 评论 -
[HEOI2015] 兔子与樱花
题目描述: 给出一棵树 一个点的载重定义为 Ri+Son(i) 若删去一个点 那么这个点的载重会加到本点存在的祖先节点 给出一个载重限制 m 问在每个节点载重都不超出 m的情况下 最多删去几个节点 不能删去根节点 题目分析: 最水的省选题目了 我们贪心着搞就行了,先删去载重最小的儿子 节点标号是从0-N-1 题目链接: BZOJ 4027 COGS 1968 L...原创 2018-03-16 14:20:23 · 303 阅读 · 0 评论 -
[Vijos 1308]埃及分数
题目描述: 把一个真分数分解成若干个分子为1的分数之和 并且要求分数越少越好,最小的分数越大越好 题目分析: 有两个限制条件,考虑到分数的个数实际上就是我们深搜的层数,所以使用迭代加深搜索 题目链接: Vijos 1308 Ac 代码: #include <iostream> #include <cstdio> #include <algorith...原创 2018-03-29 08:14:27 · 225 阅读 · 0 评论 -
[POI2000] 病毒
题目描述: qwq. 题目分析: 把病毒串构建一个Ac 自动机 然后我们在Ac自动机上DFS,如果能够DFS出一个无病毒环,即成功! 题目链接: Luogu 2444 Ac 代码: #include <cstdio> #include <iostream> #include <cstring> #include <string> ...原创 2018-04-02 16:42:21 · 316 阅读 · 0 评论 -
[TJOI2014]Alice and Bob
题目描述: 定义一个序列 x1,x2...xnx1,x2...xn{x_1,x_2...x_n} a序列a1,a2...ana1,a2...an{a_1,a_2...a_n}表示以i为结尾的最长上升子序列的长度 b序列b1,b2...bnb1,b2...bnb_1,b_2...b_n表示以i为开头的最长下降子序列的长度 求在满足a序列的情况下Max(∑ni=1bi)Max(∑i=1nbi)...原创 2018-04-09 18:51:15 · 364 阅读 · 0 评论 -
[ZJOI2007] 时态同步
题目描述: 雾。 题目分析: 正解:树形DP 非正解:XJB DFS 记录maxtime[i]为以i为根的子树叶子节点距离i的最大时间 我们只需要用两次DFS即可求解答案 题目链接: Luogu 1131 BZOJ 1060 Ac 代码: #include <iostream> #include <cstdio> #define ll ...原创 2018-04-02 08:37:58 · 148 阅读 · 0 评论 -
[九省联考 2018] 一双木棋chess
题目描述: 有一个 n∗m的方格, Alice 和 Bob 玩游戏。每次每人可以选择一个格子占领,前提是这个格子未被占领且它左上方的所有格子都已被占领。 第 i行第 j 列的格子若被 Alice 占领则 Alice 获得 Ai,j 分,若被 Bob 占领则 Bob 获得 Bi,j分。 Alice 先手,所有格子都被占领时结束。双方都想最大化自己的得分与对方得分的差。求双方采取最优策略时 Al...原创 2018-04-09 09:18:07 · 617 阅读 · 0 评论 -
[Scoi2010] 幸运数字
题目描述: 雾。 题目分析: 先预处理出仅含6或8的数 然后用容斥原理求倍数 要从大到小搜,可以减少递归层数 题目链接: Luogu 2567 BZOJ 1853 Ac 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algor...原创 2018-04-01 08:05:19 · 227 阅读 · 0 评论 -
[SDOI2013] 森林
题目描述: 给出一个森林 求 1 : u -> v 路径上的第K小值 2:u v 合并 u v 所在树 题目分析: 合并?LCT? LCT没法维护第K值啊(雾 动态维护第K值肯定是要用主席树的 在树上建立主席树,我们新的节点继承父亲树信息 查询的时候求LCA,然后消除影响 合并的话我们就搞一下启发式合并qwq O(Q∗logn2)O(Q∗logn2)O(Q*logn...原创 2018-03-30 08:43:43 · 209 阅读 · 0 评论 -
[SDOI2016]齿轮
题目描述: 给你M个比例关系,求是否发生冲突! 题目分析: 按道理应该是带权并查集 然而DFS也是O(N)的 啊! 用DFS来进行判断即可! 我们用Double型来表示即可. 不要忘记加精度判断,double自身的比较误差太大 题目链接: Luogu 4072 Bzoj 4602 Ac 代码: #include <cstdio> #include <i...原创 2018-03-05 20:47:45 · 311 阅读 · 0 评论 -
Chess
题目描述 国际跳棋是一种古老的棋类游戏,远在古埃及法老时期就已存在,现代国际跳 棋是在 12 世纪定型的。国际跳棋是由各国的民族跳棋演变而来,其历史源远流长。 简化版(与标准国际跳棋略有差别)国际跳棋规则: • 国际跳棋的棋盘由 10 × 10 共 100 个格子组成 • 初始的时候,黑白双方各有 20 个棋子 • 移动:可以将我方任意棋子向左前方或右前方移动 1 步 • 跳吃:只要左原创 2017-10-25 15:05:49 · 360 阅读 · 0 评论 -
少女
少女在图上开车,她们希望把图上每条边分配给与其相连的点中的一个, 并且每个点最多被分配一条边,问可能的方案数。 【输入格式】 第一行两个整数 N ,M代表点数和边数。 接下来N行每行两个整数代表一条边。 【输出格式】 一行一个整数代表答案对10 E9 + 7取模之后的值。 【样例输入】 5 4 1 2 3 2 4 5 4 5 【样例输出】 6树中方案为size,有环即为2原创 2017-10-31 17:25:02 · 672 阅读 · 0 评论 -
文化之旅
QAQ DFS 爆搜+剪枝#include <cstdio> #include <iostream> #include <cstring> #include <queue> using namespace std; bool vis[10001]; bool ok[10001][10001]; int dis[10001],w[1001]; int head[200000],net[200000]原创 2017-11-08 09:13:13 · 330 阅读 · 0 评论 -
P2685_汽车拉力比赛
QAQ 思路:二分+DFS拓展 我们二分一个D,如果当前点和它的邻接点的高度差<=D,那么就拓展到此邻接点 然后看一下我们DFS拓展能否拓展出所有的路标,如果成功,那么说明D过大。反之,则说明过小#include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<ctime> #include<c原创 2017-08-10 16:46:05 · 244 阅读 · 0 评论 -
Mayan游戏
QAQ 思路:DFS+模拟 依次枚举每个格子,颜色不同进行交换,先下落,再进行消除 剪枝:当前有颜色的个数为1或2直接退出#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; int col[6][8]; int ans[99][3]; int num原创 2017-08-08 09:56:47 · 339 阅读 · 0 评论 -
虫食算
传送门! 1: 最为直接的想法,直接枚举这些字母所代表的数字,最后暴力判断,O(N!),只有20分 2 : 由于是加法,后一位最多只会向前一位进1或者是不进位,我们每次进入DFS每层的开始,判断,看字符串中的每位字母是否已经求出,如果三者全部求出,如果第一个串的当前位置所代表数字与第二个串所代表的数字的和不论+1还是不+1都不等于第三个串的当前位置所代表的数字,那么当前求出的状态一定不对了,直接原创 2017-08-07 17:24:19 · 542 阅读 · 0 评论 -
靶状数独
靶状数组题目链接 90分,而且超时很严重,与或运算不会23333333int len=max(a1[0],b1[0])+1; while(len>0 && !c[len]) len--; printf("%d",c[len]); for(int i=len-1;i>=1;i--) { printf("%03d",c[i]); } 16:26原创 2017-02-05 16:45:05 · 339 阅读 · 0 评论 -
斗地主
QAQ 15的搜索题目,加优化剪枝,A掉啦 首先我们把A存到a[12],把2存到a[13]中,这样处理顺子比较好处理 如果有四张的牌 首先我们肯定是带两张单牌比较优 然后是带两个对子优,之后是一个对子 因为对子组成顺子比单牌容易,所以优先搞单牌 三张的类似 然后枚举三种顺子 逐一枚举各种方案,去找最优解 因为顺子并不是越长越好的,打过斗地主的都知道吧 一个可行性剪枝是当现在的出原创 2017-06-11 08:47:44 · 297 阅读 · 0 评论 -
母亲的牛奶
QAQ 搞个三维数组记录状态 然后暴力搜索就可以啦#include <cstdio> #include <iostream> #include <algorithm> using namespace std; int a,b,c; int cnt; int ans[999]; int f[99][99][99]; void dfs(int ra,int rb,int rc) { if(f原创 2017-06-10 15:41:23 · 305 阅读 · 0 评论 -
导弹拦截
QAQ 虽说是DP题,但是搜索居然又过了,当然这肯定不是正解,但在noip的考场上得了部分分也是极好的。 后来想了一下,其实挺简单的 第一个问题是很简单的,每次打了导弹,系统最大高度就会减小到当前导弹高度,而且导弹是依次打来的,很显然我们只要找一个最大不上升子序列就可以了 主要是第二问,求系统的个数(话说不是试验阶段,只有一套系统么,,,,) 我很无耻的就想到了暴力搜索(还加了个sort)原创 2017-06-04 11:38:17 · 333 阅读 · 0 评论 -
书的复制
QAQ 这道题是一道标准的DP题 设dp[i][j]为到i个人抄完第j本书所需要的最短时间 处理一个前缀和数组s,s[i]表示抄完第i本书所需的总共时间 容易得到dp[i][j]=min(dp[i][j],max(dp[i-1][l],d[j]-d[l])) l是指第i-1个人抄的最后一本书,那么第i个人就会从l+1开始抄啦,由于复制时间为抄写最多页数的人所用的时间,所以里面的值取max原创 2017-06-08 09:43:30 · 402 阅读 · 0 评论 -
P2036 Perket
QAQ N<=10,进行DFS,对于每种食物选或不选,但是要注意至少有一种食物#include <cstdio> #include <iostream> using namespace std; int n; int s[12],t[12]; int ans=1e9; int abs(int x) { if(x<0) return -x; return x; } void dfs(原创 2017-08-17 21:00:50 · 582 阅读 · 0 评论 -
生日蛋糕!
QAQ 很明显是一道深搜题目 问题是确定R与H的初始范围是个啥子 由于是整数,那么第一层的蛋糕半径和高度起码就是m(很明显啊) 然后第一层蛋糕半径最大是个(sqrt(v/m))这个也很明显,最大的半径是在最小的高度处取得的 同理有Hmax=v/(m*m) 具体范围确定了,最基础的搜索板子打出来 仔细一看,MMP只过了30的数据,这咋办,于是开始了漫长的剪枝之路 1:可行性剪枝:当当前原创 2017-07-27 09:10:17 · 971 阅读 · 0 评论 -
P1910 L国的战斗之间谍
传送门 看了这道题,先想了贪心,但是有两个限制量,很明显是没法贪心的 但是数据范围,n<=100 很明显DFS是可以水过去的,我们DFS选到了那个人,一个人有选与不选两种方案,DFS中再加些表示总的伪装度,钱数,以及情报的局部变量去判断符不符合要求即可#include <cstdio> #include <iostream> using namespace std; int mon[999],原创 2017-08-19 08:35:54 · 350 阅读 · 0 评论 -
加分二叉树
QAQ 递归分根节点去求最大值,记录每个区间最大值的节点,记录下来。 递归输出。 记忆化搜索AC#include <cstdio> #include <iostream> #define ll long long using namespace std; ll a[99999]; ll ss[99999]; ll maxd[999][999],root[999][999]; ll dfs(in原创 2017-10-20 15:47:12 · 296 阅读 · 0 评论 -
P4876 近似排列计数
不用看啦,蒟蒻博主没AC,只打了50分的代码! 1:全排列方法暴力判断#include <cstdio> #include <iostream> #include <cstring> using namespace std; const int mod=1e9+7; bool vis[21]; int a[21],ans; void dfs(int x,int p,int k) { if原创 2017-10-05 16:34:55 · 312 阅读 · 0 评论 -
柜
思路:正方向跑一遍,如果直接能到终点输出0 如果不行,反方向从终点向起点跑,在与第一条路径的交点处放镜子即可 如果没有交点,输出-1 但是模拟跑的过程太慢,否则就满分了2333(满分不会,我是咸鱼!)#include <cstdio> #include <iostream> #include <cstring> using namespace std; int map[7001][7001];原创 2017-09-29 16:51:07 · 223 阅读 · 0 评论 -
Party
2 聚会(party.c/cpp/pas) 2.1 题目描述 你要精心策划一场聚会。 现在有 n 个人,一共有 m 个认识关系,认识的人一定是相互认识的。由于这次聚会十 分重要,你希望被邀请的每个人都直接或间接认识,不仅如此,为了避免尴尬,你还希望每 个被邀请的人都直接认识另外至少 d 个被邀请的人。作为策划者,你希望使得被邀请的人 最多。注意同一对关系最多只会出现一次,且不会出现自环。 你需要输出原创 2017-09-06 16:23:06 · 461 阅读 · 0 评论 -
Count
count 【问题描述】 李华终于逃离了无尽的英语作文, 重获自由的他对一棵树产生了兴趣。 首先,他想知道一棵树是否能分成大小相同的几块(即切掉一些边,使得每个 连通块的点数相同)。然后,他觉得这个问题过于简单,于是他想知道一共有多 少种方案可以把这棵树分成大小相同的几块。 然后他发现自己不会了,于是向聪明的你求助。 【输入格式】 第一行一个数,表示数的大小。 第二行至第 N 行,每行两个数 x,y原创 2017-08-22 16:16:25 · 415 阅读 · 0 评论 -
小木棍
传送门!题目分析首先分析可原来的小木棍的最小的长度应该在 Lmax-∑L(这是显然的啊) 那么我们把小木棍长度降序排列,便于剪枝和操作 从小到大枚举长度,len需要满足∑L%len==0(这也是显然啊) DFS中有三个参数 x表示当前要拼成长度为len的大木棍剩余的长度 next表示上一个枚举木棍的位置,因为从大到小排序了,下一个枚举的木棍应该比当前的木棍小 num表示已经拼原创 2017-08-07 10:25:17 · 341 阅读 · 0 评论 -
引水入城
QAQ 首先是第一问 这个很简单,我们只需要将上面的一排全部弄上机器,然后跑BFS,只要可以拓展出下面全部的点,就可以成功了。 再来看第二问 如果有水源可以到沙漠,那么可以到沙漠一定是连续的,我们去求每个可以到的沙漠最左和最右,最少有几个区间就可以覆盖所有沙漠,即为答案 问题转化为求区间的完全覆盖问题 方法如下: 例题1 描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意原创 2017-08-06 20:34:03 · 332 阅读 · 0 评论