【bfs】单向公路-C++】的更多相关文章

题目: 描述 某地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,并且有的公路并不能双向行驶.现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另一个城镇.(我们规定,城镇自己跟自己可互相到达,即 a 可到达 a). 输入 第一行只有一个数 N ,下面将跟着 2N 行数据. 在前 N 行数据中,每行数据开头第一个数字 number,表明这一行总共有 number个数, number的下一个数为 i ,代表编号为 i 的城镇.这行余下的就是跟…
题目链接:http://acm.swust.edu.cn/problem/0085/ Time limit(ms): 5000 Memory limit(kb): 65535   Description 某个地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,且有公路的并不都能双向行驶.现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另一个城镇.(我们规定,城镇自己跟自己可互相到达,即A可到达A). Input 第一行只有一个数N,下面将跟着…
Description 某个地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,且有公路的并不都能双向行驶.现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另一个城镇.(我们规定,城镇自己跟自己可互相到达,即A可到达A). Input 第一行只有一个数N,下面将跟着2N行数据. 在前N行数据中,对于每行数据,最开头一个数字number,表明这一行总共有number个数,number的下一个数为i,代表编号为i的那个城镇.这行余下的就是跟i有公…
描述 某地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,并且有的公路并不能双向行驶.现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另一个城镇.(我们规定,城镇自己跟自己可互相到达,即 a 可到达 a). 输入 第一行只有一个数 N ,下面将跟着 2N 行数据. 在前 N 行数据中,每行数据开头第一个数字 number,表明这一行总共有 number个数, number的下一个数为 i ,代表编号为 i 的城镇.这行余下的就是跟 i 有公…
题目: w*h(w,h≤16)网格上有n(n≤3)个小写字母(代表鬼).要求把它们分别移动到对应的大写字母里.每步可以有多个鬼同时移动(均为往上下左右4个方向之一移动),但每步结束之后任何两个鬼不能占用同一个位置,也不能在一步之内交换位置.输入保证所有空格连通,所有障碍格也连通,且任何一个2*2子网格中至少有一个障碍格.输出最少的步数. 分析: 1.又碰到了“状态”这个很玄乎的词了.以当前三个鬼的位置为状态,那就有256^3(16*16=256)个,然后三个鬼在每一个状态中的移动有5^3个,这时…
#include<cstdio> #include<map> #include<vector> #include<stack> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<cstdlib> #define PI acos(-1.0) us…
bfs,即广度优先搜索,主要通过队列(queue)进行操作. 稍微解释一下,队列是一种基础数据结构,其形态类似于一支长长的队伍,大概如下: 在C++中,队列的头文件定义为:#include<queue> 队列的声明:queue<T1> q; 这样就定义了一个数据类型为"T1"的队列q. 成员函数及作用集合: q.empty() 判断队列q是否为空,当队列q空时,返回true;否则为false(值为0(false)/1(true)). q.size() 访问队列q…
2018-10-02 23:46:38 问题描述: 问题求解: 显然是个解空间遍历问题,每次修改其中一位,由于步长是1,所以可以使用BFS进行解空间的遍历.…
针对算法的知识点进行记录 简易桶排序 首先看一个简易桶排序,有一串数字,进行从大到小排列.数字间隔不大,使用一维数组来当作桶,进行插入排序. static void Main(string[] args) { ] { , , , , , , , , , }; ]; //定义桶 ; i < input.Length; i++) { tong[input[i]]++; //给桶进行赋值 } //利用桶数据循环输出下标 ; i >= ; i--) { ; j <= tong[i]; j++)…
问题描述 小ww生活在美丽的ZZ国.ZZ国是一个有nn个城市的大国,城市之间有mm条单向公路(连 接城市ii.jj的公路只能从ii连到jj).城市ii.jj是友好城市当且仅当从城市ii能到达城市jj并 且从城市jj能到达城市ii.如果kk个城市两两互为友好城市,那么我们称这kk个城市是友好 城市群,kk为友好城市群的大小.现在小ww想知道友好城市群的大小最大为多少,你能告诉 他吗? 输入格式 第一行包含两个整数nn 和mm. 接下来mm 行,每行两个整数ii和jj,表示有从城市ii到城市jj的一…
友好城市 [问题描述]小 w 生活在美丽的 Z 国. Z 国是一个有 n 个城市的大国, 城市之间有 m 条单向公路(连接城市 i. j 的公路只能从 i 连到 j). 城市 i. j 是友好城市当且仅当从城市 i 能到达城市 j 并且从城市 j 能到达城市 i. 如果 k 个城市两两互为友好城市, 那么我们称这 k 个城市是友好城市群, k 为友好城市群的大小. 现在小 w 想知道友好城市群的大小最大为多少, 你能告诉他吗? [输入格式]第一行包含两个整数 n 和 m.接下来 m 行, 每行两…
先了解下CPU的简单运行原理: 它运行速度非常快,1s内可以运行成千上万次,一个核心可以把1s切分成成千上万个时间片段,这个核心确实同时只能运行一个任务:但是可以将多个任务交替执行,比如上一个时间片段内运行A任务,下个时间片段可以运行B任务,交替执行,因为时间片段很短,所以感觉就是同时在进行了. 再了解下单线程和多线程的区别: 先看下单进程,顾名思义,就是一条进程,类似于单向公路上只有一条车道,每次只能过一辆车,多进程则表示多个车道,可以同时过多辆车:那么单线程和多线程意义严格上来说不是进程这样…
题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么它们就会被认为是一对友好城市. Byteland 的交通系统十分特殊,第i 天只有编号在[li, ri] 的单向公路允许通行,请写一个程序,计算每天友好城市的对数. 注意:(a, b) 与(b, a) 没有区别. 70 Kosarajo算法 这是一个区别于tarjan算法的求强连通分量的算法. 流程…
题目链接 单向bfs就是水题 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> using namespace std; const int INF = 0x3f3f3f3f; + ; struct Node { int x, y; }; int g[Max][Max]; int vis[Max][Max];…
公路通行税(Ceoi99) 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! 在PALMIA国家内,有N个城市由公路相连(每条公路恰好双向连接两个城市).经由一条公路或多条公路,从任一城市出发可以到达其余各个城市.直到今年,公路上才要征收公路通行税.在每条公路的中间,有一征税员,从每一辆经由此路的车收取 1 PALMIA COIN(1PC). 政府官员决定减少收税员而推行公路印花.如果一辆车欲进入一条公路,就必须将这张印花…
主题链接:Knight Moves 题意:8个方向的 马跳式走法 ,已知起点 和终点,求最短路 研究了一下双向BFS,不是非常难,和普通的BFS一样.双向BFS只是是从 起点和终点同一时候開始搜索,可降低搜索时间 当两条搜索路线相遇时,结束. 貌似有一年百度的招聘 笔试,就是双向BFS. ... 以下,比較一下BFS 和 双向BFS的用时. BFS STL的queue可能会浪费一点时间 #include <iostream> #include <cstdio> #include &…
解题思路: 1.注意到2*2方格中必有一个#,那么最多只有192条通道,可以将所有非‘#’的位置提取出来用邻接表的方式建图,通过bfs搜索目标位置. 2.将三个ghost的位置(a,b,c)作为状态量存储,如果采用邻接矩阵方式存储图,那么转移代价为5*5*5,很容易超时.分析题意可以知道图中结点大部分不是4个方向都能通过,用邻接表可以避免做多余的判断. 代码如下: #include <iostream> #include <cstdio> #include <cstring&…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 21754    Accepted Submission(s): 7969 Problem Description There is a strange li…
转自:http://www.cppblog.com/Yuan/archive/2011/02/23/140553.aspx 如果目标也已知的话,用双向BFS能很大程度上提高速度. 单向时,是 b^len的扩展: 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时. 至于实现上,网上有些做法是用两个队列,交替节点搜索 ×,如下面的伪代码:    while(!empty()){ 扩展正向一个节点 遇到反向已经扩展的return 扩展反向一个节点 遇到正向已经扩展的return }…
转自“Yuan” 如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ×,如下面的伪代码: while(!empty()) { 扩展正向一个节点 遇到反向已经扩展的return 扩展反向一个节点 遇到正向已经扩展的return } 但这种做法是有问题的,如下面的图:   求S-T的最短路,交替节点搜索(一次正向节点,一次反向节点)时 Step 1…
题目大意:给定一个4位素数,一个目标4位素数.每次变换一位,保证变换后依然是素数,求变换到目标素数的最小步数. 解题报告:直接用最短路. 枚举1000-10000所有素数,如果素数A交换一位可以得到素数B,则在AB间加入一条长度为1的双向边. 则题中所求的便是从起点到终点的最短路.使用Dijkstra或SPFA皆可. 当然,纯粹的BFS也是可以的. 用Dijkstra算法A了题目之后,看了一下Discuss,发现了一个新名词,双向BFS. 即从起点和终点同时进行BFS,相遇则求得最短路. 借鉴了…
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2485 题意:给你n个点,m条相连的边,问你最少去掉几个点使从1到n最小路径>=k,其中不能去掉1,n两个点. 题解:这个题目可以用最小流解决,也可以用IDA*  +  BFS解决. AC代码: #include <iostream> #include <cstdio> #include <cstring> #include <string> #include…
题目链接:hdu 4856 Tunnels 题目大意:给定一张图,图上有M个管道,管道给定入口和出口,单向,如今有人想要体验下这M个管道,问最短须要移动的距离,起点未定. 解题思路:首先用bfs处理出两两管道之间移动的距离,然后后用状态压缩求出最短代价,dp[i][j],i表示的已经走过的管道,j是当前所在的管道. #include <cstdio> #include <cstring> #include <queue> #include <algorithm&g…
黑白图像直方图 发布时间: 2017年7月9日 18:30   最后更新: 2017年7月10日 21:08   时间限制: 1000ms   内存限制: 128M 描述 在一个矩形的灰度图像上,每个像素点或者是黑色的或者是白色的.黑色像素点用1表示,白色像素点用0表示.现在要求你编写一个程序,计算每列上黑色像素点的个数并输出.如下图所示是一个6∗8的黑板图像. 1 1 0 0 1 1 1 1  0 1 1 0 1 0 1 0  1 1 1 1 0 1 1 0  0 1 1 0 0 1 0 0 …
SDUST的训练赛 当时死磕这个水题3个小时,也无心去搞其他的 按照题意,转换成无向图,预处理去掉单向的边,然后判断剩下的图能否构成两个无向完全图(ps一个完全图也行或是一个完全图+一个孤点) 代码是赛后看的网上大神,所以转载过来了,dfs染色的时候很巧妙,巧妙的用到了就两个无向完全图 #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <qu…
可以利用并查集或者带颜色标记的BFS(来自算法导论)判断. 首先介绍第一种,用并查集来判断: 首先初始化所有元素的根为-1,-1代表根节点,接下来对于图中的每一条边(v1,v2)都并入集合,并入的方式为查找v1和v2的根节点,然后让v2的根节点作为v1的根节点,查找根节点的过程为:如果当前的结点根为-1,说明这个结点就是根,直接返回,否则再继续查找结点父亲的根,直到找到祖先结点,这里因为只是判断环路,不需要压缩路径: int findSet(int x){ if(Parent[x] == -1)…
能够用 BFS 解决的问题,一定不要用 DFS 去做! 因为用 Recursion 实现的 DFS 可能造成 StackOverflow! (NonRecursion 的 DFS 一来你不会写,二来面试官也看不懂) 1. Queue Python中,使用collections.deque,双端队列 class MyQueue: # 队列初始化 def __init__(self): self.elements = [] # 用list存储队列元素 self.pointer = 0 # 队头位置…
Problem UVA1601-The Morning after Halloween Accept: 289 Submit: 3136 Time Limit: 12000 mSec  Problem Description  Input  Output For each dataset in the input, one line containing the smallest number of steps to restore ghosts into the positions where…
如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ×,如下面的伪代码:     while(!empty()) { 扩展正向一个节点 遇到反向已经扩展的return 扩展反向一个节点 遇到正向已经扩展的return } 但这种做法是有问题的,如下面的图: 求S-T的最短路,交替节点搜索(一次正向节点,一次反向节点)时 Step 1 : S –>…
对于搜索树分支很多且有明确起点和终点的情况时,可以采用双向搜索来减小搜索树的大小. 对于双向BFS来说,与单向最大的不同是双向BFS需要按层扩展,表示可能到达的区域.而单向BFS则是按照单个节点进行扩展,因为只有当前状态. 代码如下: #include <bits/stdc++.h> using namespace std; const int maxn=810; char mp[maxn][maxn]; int n,m,tot,step,f; struct node{ int x,y; }b…