樹和圖的廣度優先遍歷
阿新 • • 發佈:2022-03-15
這裡介紹樹和圖的廣度優先搜尋,我們要去找到那個到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;
}
這題不是很難,我們重點在於熟悉樹和圖的深搜和廣搜操作!