BFS小结
其实bfs本身不难,甚至不需要去学习,只要知道它的特性就可以写出来了。往往,bfs都是用递归做的。递归比循环更容易timeout。所以这次遇到一题bfs,卡时间的就悲剧了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define N (1000+10)
#define INF (1<<30)
vector<int> Map[N];
int vis[N];
int Hash[N];
int n,m;
int res,ans[N];
void bfs(vector<int> vi,int cnt)
{
int nsize = vi.size();
if(nsize==) return;
if(cnt == m+){return;}
++cnt;
vector<int> vnext;
for(int i=;i<nsize;++i)
{
int val = vi[i];
vis[val] = ;
//printf("[%d] ",vi[i]+1);
int nMapSize = Map[vi[i]].size();
if(!Hash[val])
{
++res;
Hash[val] = ;
}
for(int j=;j<nMapSize;++j)
if(vis[Map[val][j]]== && Hash[Map[val][j]]==)
{
vnext.push_back(Map[val][j]);
}
}
//printf("\n");
if(vnext.size());
bfs(vnext,cnt);
for(int i=;i<nsize;++i)
vis[vi[i]] = ;
}
int l;
void bfs2(int k)
{
queue<int> qi;
qi.push(k);
int presize = ;
while(!qi.empty())
{
int val = qi.front();
qi.pop();
++res;
vis[val] = ;
for(int i=;i<Map[val].size();++i)
{
int mapval = Map[val][i];
if(vis[mapval]==)
{
vis[mapval] = ;
qi.push(mapval);
//printf("[%d] ",mapval+1);
}
}
--presize;
if(presize==)
{
//printf("\n");
++l;
presize = qi.size();
}
if(l==m+) break;
} res = res > ? res- : ;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;++i)
{
int k;
scanf("%d",&k);
for(int j=;j<k;++j)
{
int s=i,e;
scanf("%d",&e);
--e;
//反向
Map[e].push_back(s);
}
}
int k;
scanf("%d",&k);
for(int i=;i<k;++i)
{
int s;
scanf("%d",&s);
--s;
/*vector<int> vi;
vi.push_back(s);
res = 0;
memset(Hash,0,sizeof(int)*(n+10));
memset(vis,0,sizeof(vis));
Hash[s] = 1;
bfs(vi,0);
*/
res = ;
l = ;
memset(vis,,sizeof(vis));
bfs2(s);
printf("%d\n",res);
}
return ;
}
BFS小结的更多相关文章
- BFS的小结
写这类搜索题.首先感觉要有个框架.比如我的框架对于BFS来说(对于DFS,我想有两个一个是递归版一个是栈版).这里是BFS小结.所以介绍一下BFS.我的框架.(也是搜集了网上许多神人的作品.) 1:节 ...
- 小结:bfs
概要: 我们在初始状态要到达终止状态可以沿着同深度的向下搜索,这样范围覆盖更广,在解的深度较小的时候十分适用. 技巧及注意: 所有状态在转移后如果要打标记一定要在进队列前打!不要在出队列才打!否则就是 ...
- bfs与dfs小结
1,bfs适合状态容易存储的题目,如果状态比较难存储,就难以进行记忆化搜索,必然会难以bfs. (比如听说滑雪这个题你用bfs会死得很难看) 2,但是有些题目会很深(比如网格单源最短路),用dfs会跑 ...
- POJ 3414 Pots【bfs模拟倒水问题】
链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...
- PatrolRobot(UVa1600)BFS
PatrolRobot(UVa1600)BFS 珉黻郐距 河吏蝉醉 闵棵黏言 芤她之瞌 褰上稽莨 錾傻奉 郦玫睃芩 摇摇头还没回答魏海洪就抢先回答道:呵呵你们几个别试 蚰镉氡 钬 绦可 ...
- 2017河工大校赛补题CGH and 赛后小结
网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...
- 2018年天梯赛LV2题目汇总小结
Ⅰ.L2-1 分而治之---邻接表 分而治之,各个击破是兵家常用的策略之一.在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破.为此参谋部提供了若干打击方案.本题 ...
- 深度估计&平面检测小结
https://yq.aliyun.com/ziliao/582885 最近一段时间已知忙着赶图像分析与理解的项目,在三个星期内强行接触了CNN,MRF,Caffe,openCV在内的很多东西.现在项 ...
- 第七十四课 图的遍历(BFS)
广度优先相当于对顶点进行分层,层次遍历. 在Graph.h中添加BFS函数: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" ...
随机推荐
- [K/3Cloud]K3Cloud的移动审批方面
基于最新的K3Cloud2的SP2,当前K3Cloud上所有的工作流都可以在移动手机上进行移动审批,具体如下: K/3 Cloud 支持移动审批,支持安卓和IOS. 关于申请试用: 1.打开浏览器,进 ...
- NYOJ2 括号配对问题
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=1 ...
- 试来试去,WIN下最简单的WIN API开发工具,Pelles C就好啦
昨晚试过N个,不是太大,就是不容易和WIN API集成. 今早一试就灵了个.... Pelles C. Pelles C是一款windows下的C IDE,支持调试,且为免费.它有一个高效率的链接器, ...
- [bzoj4987]Tree_树形dp
Tree bzoj-4987 题目大意:给定一颗n个点的有边权的树,选出k个点,使得:$\sum\limits_{i=1}^{k-1}dis_idis_j$最小. 注释:$1\le n\le 3000 ...
- Filter过滤器机制
tomcat内部过滤器采用了责任链的设计模式, Tomcat的过滤器主要由Filter.FilterChain组成,FilterChain包含一个Filter数组.当Wrapper执行FilterCh ...
- vim 快速搜索的快捷键
当光标在某个单词上面的时候 按 shift + #键(或 shift + * )就可以了!!! ----------------------------------- If you are worki ...
- 修改Cygwin的默认启动目录
安装Cygwin后发现Cygwin默认的用户主目录是Windows的用户主目录(一般为:C:\Users\[UserName]\),要想修改为cygwin安装目录下的home\[UserName]\可 ...
- Error处理: 重提No Launcher activity found!
Error处理: 重提No Launcher activity found! 重提No Launcher activity found!错误提示,及解决的方法 Android应用开发中No Launc ...
- 跨平台C、C++代码注意的事项
在我们的开发中,跨平台的需求越来越强烈,怎样保持C/C++代码能在多个平台上编译,是一个比較值得研究的问题.关于跨平台的文章网上非常多,跨平台的库网上也非常多.那么我从自己的跨平台开发经验谈一谈自己的 ...
- iOS 手机没有安装支付宝的情况下,不调支付宝网页的解决的方法
NSArray *array = [[UIApplication sharedApplication] windows]; UIWindow* win=[array objectAtIndex:0]; ...