bfs,队列】的更多相关文章

第一篇博客,格式惨不忍睹.首先感谢一下鼓励我写博客的大佬@Titordong其次就是感谢一群大佬激励我不断前行@Chunibyo@Tiancfq因为室友tanty强烈要求出现,附上他的名字. Catch That Cow(POJ3278) BFS入门题,然鹅我还是WA了四五发,因为没注意,位置0是可以访问的.再者就是初始位置在push之后,要标记为已经访问. 图片挺不错,我们地大(武汉)的旖旎风光,放松一下. 题目链接:POJ3278 Description Farmer John has be…
Plague Inc. is a famous game, which player develop virus to ruin the world. JSZKC wants to model this game. Let's consider the world has N\times MN×M cities. The world has NN rows and MMcolumns. The city in the XX row and the YY column has coordinate…
1 .问题描述 要求设计实现农夫过河问题(农夫带着一只狼,一只养,一棵白菜,一次只能带一个东西)如何安全过河. 2 .问题的解决方案: 可以用栈与队列.深度优先搜索算法及广度优先搜索算法相应的原理去解决问题. 1)   实现四个过河对象(农夫.白菜.羊和狼)的状态,可以用一个四位二进制数来表示,0表示未过河,1表示已经过河了. 2)   过河的对象必须与农夫在河的同一侧,可以设计函数来判断. 3)   防止状态往复,即农夫将一个东西带过去又带回来的情况发生,需将所有可能的状态进行标定. 4)  …
这个拆边+队列操作实在是太秒了 队列头结点存的是一个存点集的vector,1到这个点集经过的路径权值是一样的,所以向下一层拓展时,先依次走一遍每个点的0边,再走1边...以此类推,能保证最后走出来的路径是最优的 /* 拆边+将每个点的边按权值排序+BFS */ #include<bits/stdc++.h> #include<vector> using namespace std; #define N 1000005 #define ll long long #define mod…
相比于POJ2251的三维BFS,这道题做法思路完全相同且过程更加简单,也不需要用结构体,check只要判断vis和左右边界的越界情况就OK. 记得清空队列,其他没什么好说的. #include<iostream> #include<queue> #include<cstring> #include<cstdio> using namespace std; const int maxn=100001; bool vis[maxn]; int step[max…
Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5401    Accepted Submission(s): 1823 Problem Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally.…
Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer Jo…
思路: 最大步骤有20,直接BFS会超时. 因为知道开始情况和结果所以可以用双向BFS,每个BFS规定最大步骤为10,这样相加肯定小于20.这里要保存每个状态搜索到的最小步骤,用Hash储存.当发现现有状态已经在另一路出现了,那么就输出两者相加的步骤和. 代码: #include<iostream> #include<algorithm> #include<queue> #include<map> #define ll long long using nam…
1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和pRoot.right是否对称即可 2.左右节点的值相等且对称子树left.left, right.right; left.rigth,right.left也对称 */ 代码: import java.util.*; public class Solution { boolean isSymmetr…
[题目描述] 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. [输入] 第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数. 接下来n行,每行一个长为m的字符串,表示整个迷宫的布局.字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口. [输出] 输出从起点到出口最少需要走的步数. [输入样例] 3 3 S#T .#. ... [输出样…
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black til…
bfs bfs=队列 队列的操作 头文件 #include<deque> 声明方法: 1.普通声明 queue<int>q; 2.结构体 struct node { int x, y; }; queue<node>q; 操作(假设已经定义队列为q) q.empty() 如果队列为空返回真q.pop() 删除对顶元素q.push() 加入一个元素q.size() 返回优先队列中拥有的元素个数q.top() 返回优先队列对顶元素 优先队列 优先队列容器与队列一样,只能从队尾…
又是个裸BFS... 和西安网赛那道1006一样的,只不过加上了要记录方案.顺便复习map 记录方案直接在bfs队列的结点里加一个vector<int> opt,把从开头一直到当前结点的操作序列记下来 /* PROB:msquare LANG:C++ */ #include <iostream> #include <vector> #include <algorithm> #include <map> #include <queue>…
题目传送门 /* BFS简单题:考虑x-1,x+1,x*2三种情况,bfs队列练练手 */ #include <cstdio> #include <iostream> #include <algorithm> #include <map> #include <queue> #include <set> #include <cmath> #include <cstring> using namespace std…
点击打开链接 题意:给定n个池塘,m对池塘相连,现在要将与少于2个池塘相连的池塘拆除,形成森林,求节点数为奇数的树权值之和 思路:按照拓排的思想不断删除度数小于2的节点 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e4+5; vector <ll> G[N]; queue <ll> Q;//拓排队列 queue <ll> P;//BFS队列 b…
能够用 BFS 解决的问题,一定不要用 DFS 去做! 因为用 Recursion 实现的 DFS 可能造成 StackOverflow! (NonRecursion 的 DFS 一来你不会写,二来面试官也看不懂) 1. Queue Python中,使用collections.deque,双端队列 class MyQueue: # 队列初始化 def __init__(self): self.elements = [] # 用list存储队列元素 self.pointer = 0 # 队头位置…
如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ×,如下面的伪代码:     while(!empty()) { 扩展正向一个节点 遇到反向已经扩展的return 扩展反向一个节点 遇到正向已经扩展的return } 但这种做法是有问题的,如下面的图: 求S-T的最短路,交替节点搜索(一次正向节点,一次反向节点)时 Step 1 : S –>…
搜索里有深搜,又有广搜,而广搜的基础就是队列. 队列是一种特殊的线性表,只能在一段插入,另一端输出.输出的那一端叫做队头,输入的那一端叫队尾.是一种先进先出(FIFO)的数据结构. 正经的队列: 头文件:#include <queue> 入队:q.push(要入队的数) 返回第一个元素:q.front( ) 从队列中移除第一个元素:q.pop( ) 查看队列中元素的个数:q.size( ) 返回队列的最后一个元素:q.back( ) 用数组模拟的队列: 可以定义数组q[100001](可大可小…
bool visit[maxn];///访问标记 ,,,,-,,-,}; ///向左上右下,左下,右上,右下,左上 ,,,-,-,,,-}; struct node { int r; int c; int step; }; node input[maxn]; void bfs(node start) { queue <node> q; /// BFS 队列 node now,next; /// 定义2 个状态,当前和下一个 start.Step_Counter=; /// 计数器清零 q.pu…
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <queue> #include <cstring> #include <map> #include <set> using namespace std; ; //可移动方向…
P4289 [HAOI2008]移动玩具 双向bfs+状态压缩+记忆化搜索 双向bfs用于对bfs的优化,每次找到可扩展节点少的一边进行一次bfs,找到的第一个互相接触的点即为最短路径 矩阵范围仅4*4大小,我们容易想到用二进制数压缩其状态,利于求解. 既然转成二进制,大小又<2^17,那么可以再加数组进行记忆化 不要忘了起点终点相同时的特判qwq #include<iostream> #include<cstdio> #include<queue> #inclu…
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=649 Rescue Time Limit: 2 Seconds      Memory Limit: 65536 KB Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There a…
我的BFS板子 struct node{/*略*/};//表示一个状态 std::map<node,bool>vis;//判断每个状态是否已访问过 std::queue<node>q;//BFS扩展队列 //BFS主代码 q.push(start_node); //初始节点入队 vis[start_node] = 1; while (!q.empty()) { node head = q.front(); //去队首元素进行拓展 q.pop(); for (int i : dire…
Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns). At the beginning, each grid of this board is consisting of grass or just empty and then they start to fire all the grass. Firstly they c…
注意: 一个点可能有多把钥匙,所以把每个点有钥匙的情况状压一下 两个点之间有障碍的情况只给出了单向,存的时候记得存一下反向 b[i][j]表示当前点拥有钥匙的状态,g[x1][y1][x2][y2]表示两点之间门的类型(0表示没有,-1表示墙比较方便),f[i][j][k]表示点(i,j)在拥有k状态钥匙的情况下的最小步数,v[i][j][k]表示f[i][j][k]的状态是否在bfs队列里.然后转移比较类似spfa 以及终于知道为什么这种题会在24题里了-因为24全名"网络流与线性规划二十四题…
DFS: 该DFS框架以2D坐标范围为例,来体现DFS算法的实现思想 #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; const int maxn=100; bool vst[maxn][maxn]; //访问标记 int map[maxn][maxn]; //坐标范围 int dir[4][2]={0,1,0,-1,1,0,-1,0}; //方向向量,(x,y)周围的四…
BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie$图的性质和$DP$的性质简直是完美契合.. 模式串数量很少,考虑状压 定义$f[x][s]$表示现在所在$Trie$图内的位置为$x$,已经匹配到的串的状态为$s$,此时需要文本串的最短长度 转移十分显然,$f[fail_{x}][s|ed[fail_{x}])]=min(f[x][s])+1$ 最后找出最…
转载于https://blog.csdn.net/alalalalalqp/article/details/9155419 BFS模板: #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; ; bool vst[maxn][maxn]; // 访问标记 ][]={,,,-,,,-,}; // 方向向量 struct State…
\(IDA^*\) 说实话,这道题我一开始没想出正解,于是写了一个\(IDA^*\)... 但神奇的是,这个\(IDA^*\)居然连字符串长度分别为\(2500,4000\)的数据都跑得飞快,不过数据发下来之后我测了一下只有45分. 就在不断优化\(IDA^*\)的过程中,我突然就想出了正解的做法,看来以后遇事不决先暴力. \(DP\)求解第一个询问 考虑一个\(DP\),我们设\(f_{i,j}\)表示当前在第一个字符串中是第\(i\)位,第二个字符串中是第\(j\)位的最小步数. 若记录\(…
双向宽度优先搜索 (Bidirectional BFS) 算法适用于如下的场景: 无向图 所有边的长度都为 1 或者长度都一样 同时给出了起点和终点 以上 3 个条件都满足的时候,可以使用双向宽度优先搜索来求出起点和终点的最短距离. 算法描述 双向宽度优先搜索本质上还是BFS,只不过变成了起点向终点和终点向起点同时进行扩展,直至两个方向上出现同一个子节点,搜索结束.我们还是可以利用队列来实现:一个队列保存从起点开始搜索的状态,另一个保存从终点开始的状态,两边如果相交了,那么搜索结束.起点到终点的…