深搜和广搜是图论里面非常核心的一部分内容,用它可以解决很多的问题 。
广度优先搜索可以对一棵树进行层次遍历,也可以用来求迷宫里面两个点之间的
最短的一条路径。下面是实现对一棵树的层次遍历:
void BFS(int n)
{
queue<int> T;
for(int i=1;i<=n;++i) visit[i] = false;
for(int i=1;i<=n;++i)
{
if(!visit[i])
{
visit[i] = true;
T.push(i);
while(!T.empty())
{
int cur = T.front();
Visit(cur);
T.pop();
Node *link = Edg[cur];
while(link)
{
if(!visit[link->to])
{
visit[link->to] = true;
T.push(link->to);
}
link = link->next;
}
}
}
}
}
而对于深度优先搜索的操作则是这样的
void dfs(int u)
{
Visit(u);
visit[u] = true;
Node *link = Edg[u];
while(link)
{
if(!visit[link->to])
{
dfs(link->to);
}
link = link->next;
}
}
void solve(n)
{
memset(visit,false,sizeof(visit));
for(int i=1;i<=n;++i)
{
if(!visit[i])
{
dfs(i);
}
}
}
用这种深搜的方法可以判断从一个顶点出发能够到达哪些地方,经常在一些对羿的题中可以用到它。
广度优先搜索可以对一棵树进行层次遍历,也可以用来求迷宫里面两个点之间的
最短的一条路径。下面是实现对一棵树的层次遍历:
void BFS(int n)
{
queue<int> T;
for(int i=1;i<=n;++i) visit[i] = false;
for(int i=1;i<=n;++i)
{
if(!visit[i])
{
visit[i] = true;
T.push(i);
while(!T.empty())
{
int cur = T.front();
Visit(cur);
T.pop();
Node *link = Edg[cur];
while(link)
{
if(!visit[link->to])
{
visit[link->to] = true;
T.push(link->to);
}
link = link->next;
}
}
}
}
}
而对于深度优先搜索的操作则是这样的
void dfs(int u)
{
Visit(u);
visit[u] = true;
Node *link = Edg[u];
while(link)
{
if(!visit[link->to])
{
dfs(link->to);
}
link = link->next;
}
}
void solve(n)
{
memset(visit,false,sizeof(visit));
for(int i=1;i<=n;++i)
{
if(!visit[i])
{
dfs(i);
}
}
}
用这种深搜的方法可以判断从一个顶点出发能够到达哪些地方,经常在一些对羿的题中可以用到它。