1. 程式人生 > 實用技巧 >搜尋與圖論一

搜尋與圖論一

1.關於搜尋問題,DFS是沒有一個固定的模板的,但是也可以進行一下總結

DFS  stack  O(n)   沒有固定模板(但是有一般思路) 適用於對空間要求較高

BFS  queue  O(2^n)  有固定模板  有最短性質(對各邊權重為1的時候)

2.DFS函式書寫思路虛擬碼:

void DFS (資料型別  引數,資料型別  引數)

{

  if (出口條件)  輸出;

  for(搜尋深度)if (新點)  新點賦值;標記為舊點;遞迴下一層;回溯處理(數值恢復,新舊狀態恢復);

}

3.BFS函式書寫思路虛擬碼:

queue<——初始化

|

while(queue)

{
 auto t <——隊頭元素

   |

  拓展 t 的所有距離為1 的鄰點 x :if ( x 為走過&&可以走)x入隊,更新距離陣列

}

4.DFS實戰分析:

842. 排列數字

給定一個整數n,將數字1~n排成一排,將會有很多種排列方法。

現在,請你按照字典序將所有的排列方法輸出。

輸入格式

共一行,包含一個整數n。

輸出格式

按字典序輸出所有排列方案,每個方案佔一行。

資料範圍

1n71≤n≤7

輸入樣例:

3

輸出樣例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
第一次思路: 1.確定搜尋型別    DFS因為從資料規模看,這是個n(n!),從題目描述,也沒有最短路性質字眼描述,試了一下,覺得好搞,BFS明顯是一層一層搜的,不怎麼合適 2.先找出搜尋順序  n個空位,每個空位進行搜尋 3.確定搜尋樹  畫出來了。 4.剪枝優化  暫時沒想到,覺得也剪不掉,題目思路比較清晰 那就開始第一次嘗試 #include<iostream> 沒寫完,覺得這樣寫價效比不高,時間很大一部分在這個文件排版上了,不划算。佔坑,後面來弄