樹和圖的兩種遍歷方式即為特殊的DFS和BFS
用單鏈表儲存樹和圖時,從每一個節點的頭指針只能儲存當前節點能到達的下一層的節點
寬度優先遍歷沒有進行遞歸所以每一次搜索都是以頭結點指向的位置
例如 1->2 1->3 1->5 2->8 3->6 3->7
即h[1]->5->3->2->-1;
h[2]->8->-1;
h[3]->7->6->-1;
寬度遍歷和深度遍歷的區別就是
深度優先遍歷每搜一次就進入遞歸調用自身,使得搜索的節點的頭指針發生變化即變成了指向當前節點的頭指針
然后就變成了搜索此節點能到達的下一層
寬度優先遍歷沒有進行遞歸也就是一直搜索當前節點能到達的下一層節點直到節點搜索完時再搜索下一節點
寬度優先遍歷題目:
給定一個n個點m條邊的有向圖,圖中可能存在重邊和自環。
所有邊的長度都是1,點的編號為1~n。
請你求出1號點到n號點的最短距離,如果從1號點無法走到n號點,輸出-1。
輸入格式
第一行包含兩個整數n和m。
接下來m行,每行包含兩個整數a和b,表示存在一條從a走到b的長度為1的邊。
輸出格式
輸出一個整數,表示1號點到n號點的最短距離。
數據范圍
1≤n,m≤1e5
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int N=100010; 6 int n,tt=0,hh=0,m,idx=0; 7 int e[N],ne[N],q[N]; 8 int d[N],h[N]; 9 void add(int a,int b) 10 { 11 e[idx]=b,ne[idx]=h[a],h[a]=idx++; 12 } 13 void bfs() 14 { 15 q[0]=1; 16 memset(d,-1,sizeof(d)); 17 d[1]=0; 18 while(hh<=tt) 19 { 20 int t=q[hh++]; 21 for(int i=h[t];i!=-1;i=ne[i]) 22 { 23 int j=e[i]; 24 if(d[j]==-1) 25 { 26 d[j]=d[t]+1; 27 q[++tt]=j; 28 } 29 } 30 } 31 cout<<d[n]<<endl; 32 } 33 int main() 34 { 35 memset(h,-1,sizeof h); 36 cin>>n>>m; 37 for(int i=1;i<=m;i++) 38 { 39 int a,b; 40 cin>>a>>b; 41 add(a,b); 42 } 43 bfs(); 44 return 0; 45 }