首页 > 其他 > 详细

无向图的深度优先与广度优先搜索代码实现

时间:2015-12-08 23:56:30      阅读:567      评论:0      收藏:0      [点我收藏+]

图采用了邻接表的形式储存。

带不带权都无所谓的

 

深度优先搜索 Depth First Search

道理和树的先序遍历差不多,把将要访问的点入栈,然后从栈里取点进行访问。

由于这只是类中的一个成员函数,有些被调用的函数的具体代码将会在文章最后补上 ,但是函数功能看注释就好了

技术分享
 1 //深度优先
 2 void GraphAdjacencyListWeight::DFSAdvanced(int StartVertex) {
 3     int *visited = new int[VertexNumber];
 4     //手动初始化
 5     //不知道为什么memset不好用
 6     for (int lop = 0; lop < VertexNumber; lop++) {
 7         visited[lop] = 0;
 8     }
 9 
10     stack<int> S;
11     S.push(StartVertex);
12 
13     int NextVertex = -1;
14 
15     while (!IsAllVisited(visited)) {
16         //如果有其他的连通分量
17         if (S.empty()) {
18             //随便找一个没被访问的点丢进栈
19             for (int lop = 0; lop < VertexNumber; lop++) {
20                 if (visited[lop] == 0) {
21                     S.push(lop);
22                     break;
23                 }
24             }
25         }
26         while(!S.empty()) {
27             NextVertex = S.top();
28             S.pop();
29 
30             if (visited[NextVertex] != 1) {
31                 //访问该点
32                 VisitVertex(NextVertex);
33                 //标记为访问过
34                 visited[NextVertex] = 1;
35                 //将下一个没被访问过的邻接点入栈
36                 PushValidVertexToStack(S, NextVertex, visited);
37             }
38         }
39     }
40 }
DFS

 

令人惊讶的是广度优先搜索与深度优先搜索的代码居然是几乎相同的,除了栈换成队列。。。惊呆,这让我有点怀疑我代码的正确性。。。还请大神们指点指点

广度优先搜索 Breadth First Search

广度优先搜索的过程和树的层序遍历类似 

技术分享
 1 //广度优先
 2 void GraphAdjacencyListWeight::BFSAdvanced(int StartVertex) {
 3     int *visited = new int[VertexNumber];
 4     //手动初始化
 5     //不知道为什么memset不好用
 6     for (int lop = 0; lop < VertexNumber; lop++) {
 7         visited[lop] = 0;
 8     }
 9 
10     queue<int> Q;
11     Q.push(StartVertex);
12 
13     //下一个将要访问的顶点的序号
14     int NextVertex = -1;
15 
16     //当还有顶点没被访问时
17     while (!IsAllVisited(visited)) {
18         //如果有其他的连通分量
19         if (Q.empty()) {
20             //随便找一个没被访问的点丢进队列
21             for (int lop = 0; lop < VertexNumber; lop++) {
22                 if (visited[lop] == 0) {
23                     Q.push(lop);
24                     break;
25                 }
26             }
27         }
28 
29         while (!Q.empty()) {
30             //获取队列前端元素
31             NextVertex = Q.front();
32             Q.pop();
33 
34             //如果该点没被访问过
35             if (visited[NextVertex] != 1) {
36                 //访问该点
37                 VisitVertex(NextVertex);
38                 //标记为访问过
39                 visited[NextVertex] = 1;
40                 //将该点的邻接点入队
41                 EnQueueAllAdjVer(Q, NextVertex);
42             }
43         }
44     }
45 }
BFS

 

 

下面贴上完整的用到的函数的代码

技术分享
 1 int GraphAdjacencyListWeight::IsAllVisited(int visit[]) {
 2     for (int lop = 0; lop < VertexNumber; lop++) {
 3         if (visit[lop] == 0) {
 4             return 0;
 5         }
 6     }
 7     return 1;
 8 }
 9 
10 void GraphAdjacencyListWeight::VisitVertex(int i) {
11     cout << "Vertex : " << VectorVertexList[i]->VertexIndex << endl;
12 }
13 
14 void GraphAdjacencyListWeight::EnQueueAllAdjVer(queue<int> &Q, int index) {
15     for (auto tmpPtr = VectorVertexList[index]->firstArc; tmpPtr != nullptr; tmpPtr = tmpPtr->nextArc) {
16         Q.push(tmpPtr->AdjacencyNode);
17     }
18 }
19 
20 void GraphAdjacencyListWeight::PushValidVertexToStack(stack<int> &S, int index, int visit[]) {
21     for (auto Ptr = VectorVertexList[index]->firstArc; Ptr != nullptr; Ptr = Ptr->nextArc) {
22         if (visit[Ptr->AdjacencyNode] != 1) {
23             S.push(Ptr->AdjacencyNode);
24             return;
25         }
26     }
27 }
Functions

 

 全部代码请看 GitHub

无向图的深度优先与广度优先搜索代码实现

原文:http://www.cnblogs.com/makejeffer/p/5031272.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!