簡述dfs,bfs,Dijkstra思想及區別

2021-07-12 00:45:48 字數 2755 閱讀 8864

在做pat的時候,用dfs寫了一道題的解超時,看別人的解法時,發現別人用了dijkstra演算法,瞬間自己就混亂了,因為之前也看過dijkstra,bfs演算法,但是當時居然都傻傻分不清楚了,所以決定寫一篇總結一下。

一:廣度優先演算法(bfs)

先搜尋鄰居,搜完鄰居再搜鄰居的鄰居。

其中倆個思想:1.雙端佇列不為空則迴圈

2.將未訪問的鄰接點壓入雙端鍊錶後面,然後從前面取出並訪問(這樣就做到了廣度優先)

圖的解釋:

1          2

3        4   5        6

這個是二叉樹的例子,

這裡如果是廣度優先的話,訪問的順序依次是0123456.

**如下:

#include#include#include#include#include using namespace std;

int graph[7][7] = ;

void bfs();

dequea;

int visited[7] = ;

int main(void)

void bfs()

} visited[u] = 1; //標記為訪問

cout << u; //輸出

a.pop_front(); // 將堆前元素壓出 }

二:深度優先演算法(dfs)

我這裡介紹下遞迴思想來寫:

1.先找到出發點

2.依次對找其所有未訪問的鄰接點做dfs(仔細想想,這裡,未訪問完鄰居繼續做dfs,這樣就做到了深度優先,是不是?)

這裡貼乙個樹的深度優先搜尋樹的例子

這個樹很簡單:

1          2

3        4   5        6

是乙個二叉樹。

如果是深度優先演算法來搜,則搜尋順序應該為:0134256

這裡貼出**

#include#include#include#include using namespace std;

int graph[7][7] = ;

void dfs(int number);

int visited[7] = ;

int main(void)

void dfs(int number) }

//visited[number] = 0; //這個例子不用回朔答案也是對的,先不解釋

三.dijkstra演算法

1.找出未訪問過的到原點距離最小的頂點並標記為訪問

2.迴圈上個過程直到所有點都被訪問完

開始自己也不知道廣度優先演算法與dijkstra演算法的區別,廣度優先

是先將未訪問的鄰居壓入佇列,再將未訪問鄰居的未訪問過的鄰居壓入佇列再依次訪問,dijkstra

是在剩餘的未訪問過的頂點中找出最小的並訪問,迴圈做這個是直到所有點都被訪問完!

這裡先貼出例子:

圖為演算法導論384頁圖24-6

先大概講下過程:

圖中用鉛筆標記了01234五個點

第一步:訪問0點,並將0標記為訪問,這時候第i個點到0點的距離可以表示為dist=

第二步:這個時候,i=0已經訪問過了,此時最小的值為5,i=2,即訪問點2,這個時候點2可以到達點1,原點到點2的距離dist[2]=5加上從點2直接到點1的距離cost[2][1]=3等於8《原來的從原點直接到點1的距離dist[1]=10,則將dist[1]更新為8,同理更新其他點,這個時候dist=

第三步:這個時候i=0,2已經被訪問過了,dist最小的值為7,訪問值為7的點4.。。。。(後面繼續,直到所有點被訪問完)

實現**如下:(遞迴思想)

#include#include#include#include#include using namespace std;

int max=100000;

int cost[5][5] = ;

int dist[5] = ;

vectorvisited;

void dijkstra(int number);

int main(void)

return 0;

}void dijkstra(int number)

{ //標記為訪問過

visited[number] = true;

cout << number << endl;

//dist[i]陣列中儲存了從原點到i點的距離,dist[number]則表示從原點到number的距離,如果dist[number]+cost[number][i]

這是最後輸出的結果圖,前面輸出了訪問節點的順序,後面給出了最終的dist。

簡述mysql應用 MYSQL使用簡述

您可能感興趣的話題 mssql 一 連線mysql。1 例1 連線到本機上的mysql。首先在開啟dos視窗,然後進入目錄 mysqlbin,再鍵入命令mysql uroot p,回車後提示你輸密碼,如果剛安裝好mysql,超級使用者root是沒有密碼的,故直接回車即可進入到mysql中了,mysq...

PerformanceCounter簡述及用法

一 performancecounter簡述 1 簡單介紹 表示 windows nt 效能計數器元件 命名空間 system.diagnostics 程式集 system 在 system.dll 中 2 建構函式 只介紹本文要用到的 performancecounter string,strin...

簡述資料結構 超簡述演算法

程式由儲存資料的結構和解決問題的演算法組成,在計算機的世界裡,結構和演算法存在 相輔相成 的關係。程式根據演算法選擇最合適的儲存結構,演算法依賴儲存結構,選擇最優的策略處理資料,達到占用空間少 計算時間少的目的。打個比方,遇到乙個實際問題,需要解決兩個事情 1 如何將資料儲存在計算機中 2 用什麼方...