1. 程式人生 > 其它 >樹和圖的廣度優先遍歷

樹和圖的廣度優先遍歷

這裡介紹樹和圖的廣度優先搜尋,我們要去找到那個到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;
}

 

這題不是很難,我們重點在於熟悉樹和圖的深搜和廣搜操作!