树和图的广度优先遍历

Posted on 2022-03-15 19:31  ZheyuHarry  阅读(51)  评论(0编辑  收藏  举报

这里介绍树和图的广度优先搜索,我们要去找到那个到n最近的点,这是最短路问题,当然我们要使用BFS方式来解决这个问题

 

我们可以因为发现这道题的数据很小,所以我们如果遍历这个图的所有点也是很小的,所以我们利用BFS,去遍历每一个点,然后就是很平常的BFS操作,就无需多讲了,如果数据范围大了一点,我们也可以遇到点n直接退出!

 

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>

#define maxn 100010

using namespace std;
int e[maxn],ne[maxn],h[maxn],idx,d[maxn],n,m;

void add(int a, int b) // 添加一条边a->b
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

int bfs(int u){
queue<int> q;
memset(d,-1,sizeof(d));
d[1] = 0;
q.push(1);
while(!q.empty()){
u = q.front();
q.pop();
for(int i = h[u] ; i!=-1;i = ne[i]){
int j = e[i];
if(d[j] == -1) {
q.push(j);
d[j] = d[u] + 1;
}

}
}
return d[n];
}

int main()
{
memset(h, -1, sizeof h);
cin>>n>>m;
for(int i = 0;i<m;i++){
int a,b;
cin>>a>>b;
add(a,b);
}
cout << bfs(1) ;
return 0;
}

 

这题不是很难,我们重点在于熟悉树和图的深搜和广搜操作!