用鄰接鍊錶實現BFS演算法和DFS演算法

2021-06-27 10:45:55 字數 3544 閱讀 4990

**如下:

link_graph.h檔案:

/*--------------------------------------------

用鄰接鍊錶來表示圖,並實現廣度優先搜尋演算法

和深度優先搜尋演算法

--------------------------------------------*/

#ifndef link_graph_h

#define link_graph_h

#include #include #include using namespace std;

/*定義三種顏色*/

#define white 0

#define gray 1

#define black 2

/*--------------------------

定義鄰接表結點

--------------------------*/

struct edgenode

};/*----------------------------

定義頂點表結點

----------------------------*/

struct vertexnode

};/*---------------------

定義圖為鄰接鍊錶

---------------------*/

class graph

~graph()

void addsingleedge(int start, int end, int value);

void adddoubleedge(int start, int end, int value);

void deletesingleedge(int start, int end);

void deletedoubleedge(int start, int end);

void bfs(int s);

void print_path(int s, int v);

void dfs();

void dfs_visit(int u);

};/*-------------------------------

新增從頂點start到頂點end的邊,

即讓結點start指向結點end

-------------------------------*/

void graph::addsingleedge(int start, int end, int value = 1)

else

if(e && e->end == end)

newedge->next = e;

pre->next = newedge; }}

/*----------------

新增雙向邊

----------------*/

void graph::adddoubleedge(int start, int end, int value = 1)

/*------------------------------

刪除頂點start指向結點end的邊

------------------------------*/

void graph::deletesingleedge(int start, int end)

if(e == null || e->end > end)

if(e == v[start].firstedge)

else

delete e;

}/*----------------

刪除雙向邊

----------------*/

void graph::deletedoubleedge(int start, int end)

/*--------------------------

輸出結點s到v的路徑

--------------------------*/

void graph::print_path(int s, int v)

else

else

}}/*---------------------------------

廣度優先搜尋演算法

---------------------------------*/

void graph::bfs(int s)

v[s].color = gray;

v[s].d = 0;

v[s].pi = 0;

queueq;

while(!q.empty())

q.push(s);

while(!q.empty())

e = e->next;

} v[u].color = black; }}

/*--------------------------

深度優先搜尋演算法

--------------------------*/

void graph::dfs()

time = 0;

for(int u = 1; u <= n; u++) }

}void graph::dfs_visit(int u)

e = e->next;

} v[u].color = black;

time++;

v[u].f = time;

}#endif

main.cpp檔案:

#include #include "link_graph.h"

using namespace std;

/*----------------------

測試程式

----------------------*/

int main(int argc, char const *argv)

cout << "\nd";

for(int i = 1; i <= 8; i++)

cout << endl;

cout << "\ninput two nodes you want to seach for the path:" << endl; /*顯示2個結點的路徑*/

int s, v;

while(cin >> s >> v)

cout << endl;

/*深度優先搜尋*/

g->dfs();

cout << "dfs\neach node's d and f:\nnode"; /*顯示每個結點的d和f*/

for(int i = 1; i <=8; i++)

cout << "\nd";

for(int i = 1; i <= 8; i++)

cout << "\nf";

for(int i = 1; i <= 8; i++)

cout << endl;

return 0;

}

測試結果如下圖:

鄰接鍊錶的BFS和DFS(簡明版)

include include include include using namespace std const int maxsize 10 int visited maxsize 定義訪問陣列 struct arcnode 定義邊表 struct vertexnode 定義頂點表頭 class...

用DFS和BFS求連通分量(鄰接表的實現與應用)

本文內容改編自 挑戰程式設計競賽 第2彈 12.5節 給出朋友關係,判斷從指定人物出發能否通過雙向朋友鏈抵達目標人物。輸入 第一行輸入總人數n以及朋友關係數m 人的編號從0到n 1。接下來m行輸入朋友關係,每個朋友關係佔一行。1個朋友關係包含s t兩個整數,表示s和t為朋友。接下來一行輸入問題數q。...

spfa演算法鄰接表實現

東信杯 廣西大學第一屆程式設計競賽 同步賽 題意 在有向圖選取一條路徑使得路徑中邊權乘積最短,其中邊 權必定為2的正整數次冪。考慮最短路模型是邊權相加,那麼我們只需要將乘法轉化為加法 也就是將邊權對2取對數,再計算最短路得到最短長度ans,最後 我們的答案就是2 ans 1e9 7 最後計算冪時會溢...