搜索进阶
ID_BePosit
如果今天不比昨天多做一点什么,那么明天还有什么意义。
展开
-
SDUT-小F的PAT-dfs路径记录
题意:现在给你一个有n个数字的堆,然后询问你从根节点到每个叶子结点的路径,以及这个堆是个什么样子的堆。 思路:给出的次序是按照层次给的, 直接根据这个顺序进行dfs 先又后左递归输出路径即可。 #include<bits/stdc++.h>using namespace std;#define maxn 456int n,t,a[maxn],flag,id;bool ...原创 2018-12-18 17:22:10 · 167 阅读 · 0 评论 -
D - Lost in Translation Gym -BFS分层
D - Lost in Translation Gym - 101196D 给出一个图,从顶点开始(English),寻找 到每个点优先满足路径最短时的最小花费。 思路: bfs 逐层搜索。若同层中有指向同一节点但花费不同的边,取最小即可。给搜到的点上标记即可。 #include<bits/stdc++.h>using namespace std;#...原创 2018-10-21 10:00:16 · 277 阅读 · 0 评论 -
G - You Are the One-区间dp
G - You Are the One HDU - 4283 想了好久才明白题意。 题意:有n个人排成一排要上台表演,每个人有一个屌丝值pi。第i个上台表演的人,他的不满意度为(i-1)*pi。 现在有一个栈类型的屋子。这些人要按照排的顺序来,那么对于排在最前面的人, 就有两个选择: (1)让他直接上台表演; (2)让他暂时进黑屋子。 思路:不可以是有规则的调整不可以...原创 2018-10-10 17:05:08 · 145 阅读 · 0 评论 -
P2622 关灯问题II - 二进制状压
P2622 关灯问题II ^ :按位运算符 异或 0 ^ 1 得 1 1 ^ 1 得 0 0 ^ 0 得 0 1 ^ 0 得 1同为0异为1 | :当|和||的两端表达式同时为假时 << :空缺补0,被移除的高位丢弃,空缺位补0,比如32位二进制 0000....00011左移3位变成了0...00011xxx,则xxx补足000即可。规律左移是基数乘以2的移位幂次方,...原创 2018-09-22 22:22:18 · 531 阅读 · 0 评论 -
I - I Will Go -DFS序
所以说我们的点的子节点的时间区间一定包含在这个点的时间区间内。 所以如果一个点的起始时间和终结时间被另一个点包括,这个点肯定是另一个点的子节点。(算导里称之为括号化定理) 因此可以判断一个点是否是另一个点的子节点。 #include<bits/stdc++.h>using namespace std;#define maxn 2222222int n,q,l[...原创 2018-09-27 16:56:22 · 144 阅读 · 0 评论 -
F - 昂贵的聘礼-DFS等级限制
F - 昂贵的聘礼 POJ - 1062 只需传递已经进行交换过的货物的最小等级与最大等级。只要两者都不冲突即可。#include<iostream>#include<cmath>using namespace std;#define maxn 101#define inf 0x3f3f3f3fstruct node{ int p,l,...原创 2018-09-22 09:21:14 · 218 阅读 · 0 评论 -
石子归并 -记忆化搜索or区间DP
石子归并 51Nod - 1021 记忆化搜索:#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define maxn 111int dp[maxn][maxn];int sum[maxn],n,a;int dfs(int l,int r){ if(l==r)ret...原创 2018-10-02 10:08:47 · 238 阅读 · 0 评论 -
01组成的N的倍数 -同余定理
①Bfs过程中,在结构体中维护一个字符串a,表示是答案,如果我们每一次都对a整个大数取模操作的话,会增加大量的操作,因为我们每一次都是在字符串末尾加上一位,而且大数取模的过程也是从第一位开始一直向后扫着模的,所以我们这里维护一个变量num,表示当前这个答案a对n的模是多少,那么对应将下一个字符加在最后一位的时候,我们对应维护num=(num*10+0/1)%n即可。 ②最关键的剪枝,根据同...原创 2018-09-15 10:59:59 · 500 阅读 · 0 评论 -
G - Pots -BFS水杯状态
G - Pots POJ - 3414 题意:找到最快的一种能够使其中一个容器中的水为c的状态。思路:vis[]记录两个杯子中水的状态.然后搜索的时候按照六种操作进行搜索。#include <iostream>#include <cstring>#include <algorithm>#include <map>#in...原创 2018-09-15 08:40:36 · 183 阅读 · 0 评论 -
Saving Tang Monk II(BFS+priority-queue)
从S点走到T点的最短路程,其中有氧气瓶分布在地图中,用'B'表示,它的作用是耗费2s穿过'#',每次穿过一个毒气室消耗一个氧气瓶,而氧气瓶最多能带5个,地图中还存在加速药丸,用'P'表示,可以有无限个,每使用一次可以节省1s的时间,但是无需带着加速药丸走只要遇到加速药丸不花时间通过即可,还有本题时间立的大顶堆时间多的优先出队。 #include<bits/stdc++.h>...原创 2018-09-24 22:10:32 · 337 阅读 · 0 评论 -
Fliptile POJ -状压枚举第一层
Fliptile POJ - 3279 题意: 牛可以踩格子保证求一个最少踩的次数,最小状态下输出每个位置踩的次数 思路: 枚举第一层的状态依次就可以确定下面的状态。 注意递归回溯图修改恢复的处理。 #include <iostream>#include<cstring>#include<stdio.h>#include&l...原创 2018-09-13 20:26:11 · 154 阅读 · 0 评论 -
E - Counting Cliques-vector矩阵同建图
E - Counting Cliques HDU - 5952 题意: A clique is a complete graph, in which there is an edge between every pair of the vertices. Given a graph with N vertices and M edges, your task is to coun...原创 2018-09-13 16:12:04 · 279 阅读 · 0 评论 -
E - Knights of Ni POJ -两次-BFS
E - Knights of Ni POJ - 3170 题意:一个人去草丛取一个物去找另一个人,然后2,3分别是两个人,4为草丛,1为禁止走的区域求最短完成步数 思路:也就是挑一个草丛能够最快完成,第一次以2为起点进行bfs记录到达每个草丛的时间第二次以3为起点 进行 bfs 直接动态更新最小值即可。 #include<iostream>#include...原创 2018-11-02 17:15:18 · 206 阅读 · 0 评论 -
D - Knight Moves POJ - 入门级BFS
D - Knight Moves POJ - 1915 赛前回顾练手。bfs模板题。 #include<iostream>#include<queue>#include<cstring>#include<stdio.h>using namespace std;#define maxn 333int n,sx,sy,...原创 2018-11-02 14:43:25 · 210 阅读 · 0 评论 -
F - 齿轮 HYSBZ - 4602 -矛盾关系判断-并查集-DFS
F - 齿轮 HYSBZ - 4602 题意:一些齿轮两两之间有相互关系,可以根据转动关系建图,然后判断是否矛盾。 #include<bits/stdc++.h>using namespace std;#define maxn 15555int t,n,m,u,v,cnt,head[maxn];double x,y,vis[maxn];struct n...原创 2018-11-07 11:34:02 · 151 阅读 · 0 评论 -
P1379 八数码难题-启发式搜索
P1379 八数码难题 题意:在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。 思路:迭代加深就是每次限制搜索深度 ,这样可以在整个搜索树深度很大而...原创 2018-12-22 15:23:34 · 811 阅读 · 1 评论 -
hihocoder-1304 搜索一·24点
题意:给出四个数检验是否凑成24 即可。 思路:补充两种运算 a ⑤ b = b / a a ⑥ b = b - a 之后发现四个数进行所有运算无非就两种。 (((a ⊙ b) ⊙ c ) ⊙ d)((a ⊙ b) ⊙ (c ⊙ d)) 枚举四个数的位置。枚举这六种运算符即可,会有重复 总复杂度不高无需剪枝 #include<bits/stdc++.h>...原创 2018-12-22 11:21:51 · 249 阅读 · 0 评论 -
A - K-th Number POJ - 2104 -主席树第一弹-第K大的数
感谢:http://www.cnblogs.com/zyf0163/p/4749042.html https://blog.csdn.net/qq_24451605/article/details/49031123 裸题多次查询给定区间L—R内第K大的数 #include<iostream>#include<cstdio>#include<algori...原创 2018-11-25 12:03:20 · 284 阅读 · 1 评论 -
A - Ocean Currents UVA - 11573 -0-1 BFS
A - Ocean Currents UVA - 11573 题意:给定一个海面,数字分别代表海流方向,顺着海流不用费能量,逆海流要费1点能量。 每次询问给一个起点一个终点,问起点到终点耗费的最小能量 思路:广搜,队列用优先队列,每次取能量最低的点出来进行状态的转移(或者用deque 01 bfs的思路) 注意这里 不是路径最短所以不能根据bfs顺序去标记,无需vis数组,直...原创 2018-11-20 08:48:22 · 314 阅读 · 0 评论 -
P1120 小木棍 [数据加强版]-搜索+减枝
解题思路,搜索时从小到大枚举原木棍长度,显然(木棍最大长度≤原木棍长度≤木棍总长度),然后搜索判断情况能否可行。 然后就来说说最最重要的剪枝吧: 1、优化顺序,dfs判断情况时从最长的木棍枚举到最短的木棍,因为能与最长的木棍组成当前需要的长度的木棍的个数显然要比长度短的少,能减少分枝数。因为长度不超过50,于是没必要对木棍长度快排,而是直接桶排,常数小且方便判断和回溯。 2、木棍个数应该为整...原创 2018-11-17 18:04:26 · 279 阅读 · 0 评论 -
B - Three States CodeForces - 590C -0-1 BFS
B - Three States CodeForces - 590C 题意:给出一个图,有三类区域1,2,3,#是墙不能走,’.‘是可以修路的,问如何修一条路能够是三块联通 思路:bfs预处理出,三类区域到达图上个点需要修路的数量,队列堆优化修路数量少的优先级高。 然后枚举一下他们三个的交点在哪使得修路最短。 #include<bits/stdc++.h&g...原创 2018-11-17 17:29:42 · 300 阅读 · 0 评论 -
J - Jailbreak Gym - 100625J -搜索+枚举交点
J - Jailbreak Gym - 100625J 题意:有两个犯人要逃出监狱,监狱中有很多门,打开一道门需要花费1的体力, 当一个犯人打开门后另一个就不需要在打开了。走到地图外就算逃出监狱了。 ‘*’表示墙,‘.’表示路,‘#’表示门(花费1体力),问两个人都逃出去的最小花费,保证有解。 思路:最初想到最优解应该是两个人最终汇于一点然后一起走出去花费最小,但是想到有特例...原创 2018-11-17 09:38:30 · 319 阅读 · 1 评论 -
A - Find a Number CodeForces - 1070A -记忆化广搜-同余定理
A - Find a Number CodeForces - 1070A 题意: 思路:与数位dp思想有点相似,数太大无法存储,选择保留其对搜索目标有用的信息,并且记忆化减少无效多余搜索, vis[i][j]两位含义是 当前的 余数为i,各个数位的和为j时是否已经出现过,当各个数位和超过s时也应当continue。 结果记录就用pre数组,注意怎样标记才能控制不断递归到pre...原创 2018-11-21 20:44:54 · 203 阅读 · 0 评论 -
B - Security Guards Gym - 101954B -BFS+预处理
B - Security Guards Gym - 101954B 题意:一个人找了很多保安来给他看护着一个最大可能为5000*5000的二维图,给出每个保安所在点。 然后询问给出一些出事地点问到达出事地点的最近保安的距离。保安移动规则:change each of coordinates by 1, 0 or −1. 思路:就是所有保安按照8个方向走,求每个点上最近的保安到...原创 2018-11-15 18:02:56 · 438 阅读 · 0 评论 -
D - Age of Moyu HDU - 6386 -BFS+DFS分层最短路
D - Age of Moyu HDU - 6386 题意:双向图,m条边,每条边有一个编号id,而花费就是根据这个id的变化来确定的求1-n的最短路 思路:全值为0,1的图直接bfs按层遍历图找到n就一定是最短,但是这里需要注意的是相连的边并且id是相同的 需要压缩成一个点,因为在这些边上走是一直花费为0的,所以bfs分层遍历同时进行着dfs路径压缩就可知得到最优解 ...原创 2018-11-07 16:27:05 · 268 阅读 · 0 评论 -
G - Party CodeForces - 906C -状态压缩+DFS
G - Party CodeForces - 906C 题意:给出一些关系都是双人关系而且无向,可以进行一步操作,每一步操作是选择一个人, 让这个人认识关系群里面的人都相互认识,求一个最小操作数 思路:第二次碰到这样的状态压缩题目了,把一个人所认识其他人用二进制来表示1<<n-1为则表示这个人认识n个人 因为1<<n-1 二进制有n为全为1,就是说二进...原创 2018-11-07 14:42:22 · 241 阅读 · 0 评论 -
D - Tempter of the Bone -曼哈顿距离+奇偶剪枝
D - Tempter of the Bone HDU - 1010 #include<iostream>#include<cstring>#include<cmath>using namespace std;#define maxn 25int to[5][2]= {{0,1},{0,-1},{1,0},{-1,0}};char mmp[...原创 2018-09-18 15:32:28 · 263 阅读 · 0 评论 -
Nightmare Ⅱ -双向BFS(待更改)
Nightmare Ⅱ HDU - 3085 #include<bits/stdc++.h>using namespace std;#define maxn 888char mmp[maxn][maxn];bool vis1[maxn][maxn];bool vis2[maxn][maxn];int ans,n,m,t,cnt,step;struct node...原创 2018-09-18 09:04:05 · 335 阅读 · 0 评论 -
Escape -BFS(待更改)
Escape HDU - 3533#include <iostream>#include <cstring>#include <algorithm>#include <map>#include <vector>#include <stdio.h>#include <stack>#includ原创 2018-09-18 09:01:48 · 171 阅读 · 0 评论 -
F - Prime Path POJ - ( Prime +BFS)
注意判断前导0注意改变temp1的多次使用的值时要先暂时存储一下然后使用完之后恢复#include<iostream>#include<algorithm>#include<cstring>#include<queue>using namespace std;#define maxn 10000bool isprime[ma...原创 2018-06-17 20:52:31 · 172 阅读 · 0 评论 -
C - Catch That Cow
C - Catch That Cow POJ - 3278 典型的 bfs 分层次搜索,数字问题无边界dfs肯定超时注意bfs没有取消标记这一操作、防止越界的判断语句 往前放,#include<iostream>#include<cstring>#include<queue>using namespace std;#defin...原创 2018-08-03 09:12:59 · 197 阅读 · 0 评论 -
Prime Ring Problem (素环问题-路径)
Prime Ring Problem HDU - 1016 第一次竟然把a数组打成 bool Fear I'm scared to death #include<bits/stdc++.h>using namespace std;#define maxn 500bool isprime[maxn],vis[maxn];int a[max...原创 2018-08-02 20:35:50 · 370 阅读 · 0 评论 -
I - I HDU - 2586 (Summer Individual - 17)(BFS)
I - I HDU - 2586 #include<bits/stdc++.h>using namespace std;const int maxn=40005;long long ans;vector<pair<int,int > >mmp[maxn];bool vis[maxn];struct node{ int x; ...原创 2018-08-01 17:58:46 · 155 阅读 · 0 评论 -
H - Pots POJ - 3414 (bfs操作转换-路径记录)
H - Pots POJ - 3414 #include<iostream>#include<map>#include<cstring>#include<queue>using namespace std;const int maxn=102;bool vis[maxn][maxn];struct node{ int...原创 2018-08-01 11:49:07 · 231 阅读 · 0 评论 -
K - 迷宫问题 POJ - 3984 (bfs-路径打印)
K - 迷宫问题 POJ - 3984#include<iostream>#include<stack>#include<vector>#include<queue>using namespace std;int to[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};int mmp[5][5],a[100...原创 2018-08-01 11:47:40 · 399 阅读 · 0 评论 -
C - Cut 'em all! (对树进行DFS切割)
#include<bits/stdc++.h>using namespace std;#define maxn 200005int ans,n,u,v;vector <int> mmp[maxn];int siz[maxn];void dfs(int u,int pre){ siz[u]=1; for(int i=0; i<mmp[u]...原创 2018-08-09 17:14:02 · 281 阅读 · 0 评论 -
N - Find a way HDU - (双起点bfs)
N - Find a way HDU - 2612 #include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3fconst int maxn=205;char mmp[maxn][maxn];int Time[5][maxn][maxn];bool vis[maxn][maxn];int n,...原创 2018-07-31 20:15:37 · 262 阅读 · 0 评论 -
M - 非常可乐 HDU - 1495 (kele)
M - 非常可乐 HDU - 1495 #include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3fint s,n,m,ans;bool vis[101][101][101];//所有状态得标记。bool flag;void dfs(int x,int y,int z,int step)...原创 2018-07-31 17:51:50 · 316 阅读 · 0 评论 -
I - Interesting Calculator-Team Contest 4th(BFS-优先队列优化)
题意:给你两个数x,y。由x每次可以经过一系列操作变换,每个变换都有一定的费用,求x变换到y的最小费用下最小步数。 思路:类似最短路的思想,当时只想到每个点有30个方向可以走,于是直接广搜,但不是TLE就是MLE,后来比完赛看题解才知道要用优先队列。最小费用优先,然后最小步数优先。每一步都是前一步到达的,但一个点可以由多个点到达,这时我们肯定要取最优的那一步嘛。如果我们不用标记...原创 2018-08-09 15:09:48 · 135 阅读 · 0 评论 -
L - Oil Deposits HDU - (简单联通块搜索)
L - Oil Deposits HDU - 1241 #include<bits/stdc++.h>using namespace std;#define maxn 105char mmp[maxn][maxn];int t[8][2]= {{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};int n,...原创 2018-07-31 14:48:23 · 150 阅读 · 0 评论