引子:广泛搜索且盲目。
深搜:代码如下(dfs)
void dfs(int u)
{
vis[u]=true;
for(int i=head[u];i;i=next[i])
{
int v=ver[i];
if(vis[v]) continue;
dfs(v);
}
}
解释:任选一条边走下去,执行递归,直至回溯到点u后,再考虑走其他的边。
---------------------------------------------------------------------------------------------------------------------------------
广搜:代码如下(bfs)
void bfs()
{
memset(d,0,sizeof(d));
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(1),d[1]=1,vis[1]=true;
while(q.size())
{
int u=q.front();q.pop();
for(int i=head[u];i;i=next[i])
{
int v=ver[i];
if(vis[v]) continue;
d[v]=d[u]+1;
vis[v]=true;
q.push(v);
}
}
}
解释:彻底地搜索整张图,直到找到目标为止。
---------------------------------------------------------------------------------------------------------------------------------
写题心得
1.深搜第一题,“拔河游戏” 这题主要还是模板。寻要注意的是保存结果时的条件==
题目上明确要求两边人数不得相差超过一人.....也就是说只有在(y==n/2)时才将结果保存下来,
这题dfs用了三个条件...分别是考虑到第几个人,选了几个人,此时所有选的人的数量之和。
和dp异曲同工
2.广搜第一题"走迷宫图"就纯纯的模板题le。
首先要有这个
const int dx[4]={-1,0,1,0},
dy[4]={0,1,0,-1};
解释:这个表示的是标记点所走的方向,x和y需要一一对应.
当然,还要用vis【】数组来标记是否走过。
---------------------------------------------------------------------------------------------------------------------------------
不要把二维数组开太大不然就会。。。。。
出现“源文件未编译”的提示,弄了我好长一段时间一般开a[10000][10000]就差不多le
结构体直接当做一种数据类型使用 。。。
---------------------------------------------------------------------------------------------------------------------------------
3.再来说一下广搜的模板。。。(必看)
bool exist(int x,int y)//判断是否出界
{
return 1<=x&&x<=n&&1<=y&&y<=n;
}
void bfs()
{
memset(vis,false,sizeof(vis));//vis[]表示有没有走过
queue< pair<int,int> > q;//建立一个队列,“pair”表示有两个数据,有更多的数据可以有结构体
q.push(make_pair(sx,sy));//入列
d[sx][sy]=0;//d[]表示到(sx,sy)的距离
vis[sx][sy]=true;//标记
while(q.size())
{
pair<int,int> u=q.front();//标记
q.pop();//取出来
int x=u.first ,y=u.second;//取出两个数据
if(x==tx&&y==ty)//tx,ty表示终点
{
printf("%d/n",d[tx][ty]);//输出
return;
}
for(int i=0;i<4;++i)
{
int nx=x+dx[i],ny=y+dy[i];//开始向四周扩展
if(exist(nx,ny)&&a[nx][ny]=='0'&&!vis[nx][ny])
{
d[nx][ny]=d[x][y]+1;
vis[nx][ny]=true;
q.push(make_pair(nx,ny));//入队
}
}
}
}
——————————————————————于2021年7月31日19:09结尾。