搜尋與圖論一
阿新 • • 發佈:2020-09-09
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。
輸出格式
按字典序輸出所有排列方案,每個方案佔一行。
資料範圍
1≤n≤71≤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>
沒寫完,覺得這樣寫價效比不高,時間很大一部分在這個文件排版上了,不划算。佔坑,後面來弄