深度优先非递归实现算法:

1 递归算法:

//初始化相关数据结构
DFS(G)
-----------------------------------------------------------------------------------
1 for each vertex u ∈ G.V
2 u.color ← WHITE // paint all vertices white; undiscovered
3 u.π ← NIL
4 time ← 0 // global variable, timestamps
5 for each vertex u ∈ G.V
6 if u.color = WHITE
7 DFS-VISIT(G,u) DFS-VISIT(G, u)
-----------------------------------------------------------------------------------
1 u.color ← GRAY // grey u; it is discovered
2 time ← time + 1
3 u.d ← time
4 for each v ∈ G.Adj[u] // explore edge (u,v)
5 if v.color == WHITE
6 v.π ← u
7 DFS-VISIT(G,v)
8 u.color ← BLACK // blacken u; it is finished
9 time ← time + 1
10 u.f ← time

#ifndef GCC_LINUX_
#include <stdlib.h>
#include <iostream>
using namespace std;
#endif
#include "Graph.h" enum color{WHITE, GRAY, BLACK};
int colour[MAX_VERTEX_NUM];
int time[MAX_VERTEX_NUM];
int curTime; void DFSRec(LGraph graph, int u){
cout<<"for debug"<<endl;
cout<<"u: "<<u<<endl;
colour[u] = GRAY;
time[u] = ++curTime;
//DFS adj node
adjnode *temp;
temp = graph.vertices[u].firstadj; while(temp){
int v = temp->index;
//for debug
cout<<"for debug"<<endl;
cout<<"v: "<<v<<" line: "<<__LINE__<<endl;
if(colour[v] == WHITE)
DFSRec(graph, v);
else if(colour[v] == GRAY)
cout<<"back edge between "<<u<<" and "<<v<<endl;
else
cout<<"cross edge between "<<u<<" and "<<v<<endl;
temp = temp->adjnext;
}
colour[u] = BLACK;
} void DFSTraverse(LGraph graph){
for(int k = 1; k < graph.vexnum + 1; k++){
if(colour[k] == WHITE) DFSRec(graph, k);
cout<<__LINE__<<" for debug: "<<k<<endl;
}
} int main()
{
LGraph* graph;
graph = CreateGraph(graph);
cout<<graph->edgenum<<endl;
cout<<graph->vexnum<<endl;
print(*graph);
DFSTraverse(*graph);
//print time visit
cout<<"print the visit array:"<<endl;
for(int i = 1; i < graph->vexnum + 1; i++)
cout<<time[i]<<" ";
cout<<endl; int ch;
cout<<"enter integer for terminating:"<<endl;
cin>>ch;
return 0;
}

2 非递归算法

1   for each vertex u ∈ G.V //initialize colour array and time
2 u.color ← WHITE
3 u.π ← NIL
4 time = 0
5 for each vertex u ∈ G.V
6 if u.color = WHITE
7 u.color ← GRAY
8 time ← time + 1
9 u.d ← time
7 push(u, S)
8 while stack S not empty
9 u ← pop(S)
10 for each vertex v ∈ G.Adj[u]
11 if v.color = WHITE
12 v.color = GRAY
13 time ← time + 1
14 v.d ← time
15 v.π ← u
16 push(v, S)
17 u.color ← BLACK
18 time ← time + 1
19 u.f ← time
具体实现代码如下:
栈采用数组实现:
#ifndef GCC_LINUX_
#include <stdlib.h>
#include <iostream>
using namespace std;
#endif
#include "Graph.h" int myStack[MAX_VERTEX_NUM];
int top = 0; //we not use array[0]
bool visited[MAX_VERTEX_NUM];
int timeSec[MAX_VERTEX_NUM];
int curTimeSec; void DFSNoRecur(LGraph graph, int u){
cout<<u;
myStack[top++] = u;
cout<<" top:"<<top<<endl;
adjnode* temp;
//for test
int test = 1;
while(top){
int v = myStack[top - 1];
cout<<test++<<" for test top: "<<top;
cout<<" stack elem: "<<v<<endl;
visited[v] = true;
timeSec[v] = ++curTimeSec;
temp = graph.vertices[v].firstadj;
cout<<"pointer temp: "<<temp<<endl;
top--; //Pop
cout<<top;
while(temp != NULL){
if(visited[temp->index] == false){
myStack[top++] = temp->index;
cout<<test++<<" for test top: "<<top;
cout<<" stack elem: "<<myStack[top - 1]<<endl;
}
else{
cout<<"back edge between "<<temp->index;
cout<<" and "<<v<<endl;
}
temp = temp->adjnext;
}//while
}//while(top)
} void DFSTravNRecur(LGraph graph){
cout<<"No recursive DFS starting"<<endl;
for(int v = 1; v < graph.vexnum + 1; v++)
if(visited[v] == false) DFSNoRecur(graph, v);
cout<<"No recursive DFS terminating"<<endl;
} int main()
{
LGraph* graph;
graph = CreateGraph(graph);
cout<<graph->edgenum<<endl;
cout<<graph->vexnum<<endl;
print(*graph);
DFSTraverse(*graph);
//print time visit
cout<<"print the time array:"<<endl;
for(int i = 1; i < graph->vexnum + 1; i++)
cout<<time[i]<<" ";
cout<<endl; DFSTravNRecur(*graph);
cout<<"print the visit array:"<<endl;
for(int i = 1; i < graph->vexnum + 1; i++)
cout<<time[i]<<" ";
cout<<endl; int ch;
cout<<"enter integer for terminating:"<<endl;
cin>>ch;
return 0;
}

"Graph.h"文件代码定义:

#ifndef GCC_LINUX_
#include <stdlib.h>
#include <iostream>
using namespace std;
#endif
#define MAX_VERTEX_NUM 128 struct adjnode{
int index;
struct adjnode* adjnext;
}; typedef struct vexnode{
struct adjnode* firstadj;
}VertexLink[MAX_VERTEX_NUM]; typedef struct LGraph{
VertexLink vertices;
int vexnum, edgenum; }; void AddEdge(LGraph *graph, int head, int tail){
//new a adj node
adjnode *newadjnode = (adjnode*)malloc(sizeof(struct adjnode));
if(!newadjnode)
exit(EXIT_FAILURE);
newadjnode->index = tail;
newadjnode->adjnext = NULL;
adjnode *temp; temp = graph->vertices[head].firstadj;
cout<<"this edge: "<<head<<"->"<<newadjnode->index<<endl;
newadjnode->adjnext =temp;
graph->vertices[head].firstadj = newadjnode;
//debug
cout<<"line: "<<__LINE__;
cout<<" first adj index: "<<graph->vertices[head].firstadj->index<<endl; } LGraph* CreateGraph(LGraph *graph){
graph = (LGraph*)malloc(sizeof(struct LGraph));
if(!graph)
exit(EXIT_FAILURE);
cout<<"enter the vertex number and edge number:"<<endl;
cin>>graph->vexnum>>graph->edgenum; //initialize the vertexes
for(int v = 0; v < graph->vexnum + 1; v++){
graph->vertices[v].firstadj = NULL;
} //initialize the edge
int i, j;
for(int e = 0; e < graph->edgenum; e++){
cout<<"enter edge of graph:"<<endl;
cin>>i>>j;
AddEdge(graph, i, j);
}
cout<<"graph.vertex number: "<<graph->vexnum<<endl;
return graph;
} void print(LGraph graph){
adjnode *temp = NULL;
for(int i = 1; i < graph.vexnum + 1; i++){
cout<<"vertex: "<<i;
temp = graph.vertices[i].firstadj;
// cout<<"temp"<<temp<<endl;
while(temp){
cout<<" adj vertex: "<<temp->index<<endl;
temp = temp->adjnext;
}
}
cout<<endl;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Non recursive Depth first search的更多相关文章

  1. Recursive Depth first search graph(adj matrix)

    1 深度优先遍历邻接矩阵 1 邻接矩阵初始化 2 访问数组初始化 3 深度优先遍历邻接矩阵图 算法如下: bool MGraph[128][128]; bool visit[128]; int vex ...

  2. [算法&数据结构]深度优先搜索(Depth First Search)

    深度优先 搜索(DFS, Depth First Search) 从一个顶点v出发,首先将v标记为已遍历的顶点,然后选择一个邻接于v的尚未遍历的顶点u,如果u不存在,本次搜素终止.如果u存在,那么从u ...

  3. [Algorithm] Write a Depth First Search Algorithm for Graphs in JavaScript

    Depth first search is a graph search algorithm that starts at one node and uses recursion to travel ...

  4. 幸运的袋子(深度优先遍历(Depth First Search,DFS))

    题目描述 一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的).如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积. 例如:如果袋子里面的球的号码是{1, 1, 2 ...

  5. 深度优先搜索(Depth First Search)

    Date:2019-07-01 15:31:11 通俗点理解就是不撞南墙不回头的那种,用栈来实现 算法实现 /* 题目描述: 有n件物品,每件物品的重量为w[i],价值为c[i].现在需要选出若干件物 ...

  6. Add Digits, Maximum Depth of BinaryTree, Search for a Range, Single Number,Find the Difference

    最近做的题记录下. 258. Add Digits Given a non-negative integer num, repeatedly add all its digits until the ...

  7. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  8. [LeetCode] Maximum Depth of Binary Tree 二叉树的最大深度

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  9. [LeetCode] 104. Maximum Depth of Binary Tree 二叉树的最大深度

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

随机推荐

  1. cocos2dx CCControlSlider

    有的同学建议先上图,好吧,先上效果图 再看代码,创建了两个CCControlSlider在主窗口中 // on "init" you need to initialize your ...

  2. SPOJ 7258 Lexicographical Substring Search(后缀自动机)

    [题目链接] http://www.spoj.com/problems/SUBLEX/ [题目大意] 给出一个字符串,求其字典序排名第k的子串 [题解] 求出sam上每个节点被经过的次数,然后采用权值 ...

  3. PHP高手干货分享:要大大提高PHP效率

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双 引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP ...

  4. 掌握下面常用函数,学php不再难

    一.写入文件 1.打开资源(文件)fopen($filename,$mode) 2.写文件fwrite($handle,$str) 3.关闭文件fclose($handle) 4.一步写入file_p ...

  5. SqlServer 2015修改表时出现“save changes is not permitted…”的解决方法

    使用SqlServer 2015的过程中,会出现如下情况: 在修改完表字段名或是类型后点击保存时会弹出一个对话框,且无法保存已做的修改.对话框内容大致如下: Saving changes is not ...

  6. ajax验证码检测

    1.验证码文件 <%@ page language="java" pageEncoding="UTF-8"%> <%@ page conten ...

  7. subversion和客户端的应用

    1.安装svn的服务器端subversion.以及windows客户端TortoiseSVN: 2 cmd 建立库,名字为svnpro ----- svnadmin create F:\svnpro, ...

  8. Java format 简单应用

    一.前言 String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.format("Hello %s", " ...

  9. excel读入数据库

    POI3.9效率大幅度提高,支持xls以及xlsx. 首先需要POI的JAR包,MAVEN配置如下: <!-- excel start --> <dependency> < ...

  10. Protel99se轻松入门:一些高级设置和常用技巧

    给PCB补泪滴的具体操作 这里我们可以知道给PCB做覆铜是多么的简单 在PCB中如何找到我们要找的封装 在PCB中如何打印出中空的焊盘(这个功能对于热转印制板比较有用) 如何在PCB文件中加上漂亮的汉 ...