深度优先算法(递归和非递归)
#include<iostream>
#include<queue>
using namespace std;
#define MaxVNum 50
#define INFINITYDIS 10000
//adjacency matrix邻接矩阵
typedef double AdjMatrix[MaxVNum][MaxVNum];
int visited[MaxVNum];
int time;//定义深度优先搜索的时间戳
//define the info of vertex
typedef struct
{
int start;//开始时间
int end;//结束时间
int parent;//define the index of parent node
}vex;
//定义一个结构体的别名Graph
typedef struct
{
int vex_num, arc_num;//the number of vertex,the number of arc
AdjMatrix adj;//define the adjacency matrix of a graph
vex v[MaxVNum];
}Graph;
void init(Graph & g)
{
g.vex_num = 8;
g.arc_num = 9;
for (int i = 0; i < g.vex_num; i++)
{
g.v[i].parent = MaxVNum;
}
//init the adj matrix
for (int i = 0; i < g.vex_num; i++)
{
for (int j = 0; j < g.arc_num; j++)
{
g.adj[i][j] = 0;
}
}
g.adj[0][1] = 1;
g.adj[0][2] = 1;
g.adj[1][3] = 1;
g.adj[1][4] = 1;
g.adj[2][5] = 1;
g.adj[2][6] = 1;
g.adj[3][1] = 1;
g.adj[3][6] = 1;
g.adj[3][7] = 1;
g.adj[4][1] = 1;
g.adj[4][7] = 1;
g.adj[5][2] = 1;
g.adj[5][5] = 1;
g.adj[5][6] = 1;
g.adj[6][2] = 1;
g.adj[6][5] = 1;
g.adj[7][3] = 1;
g.adj[7][4] = 1;
}
//深度优先搜索每一个节点
void DFS_Visit(Graph & g, int u)
{
visited[u] = 1;
time = time + 1;
g.v[u].start = time;
for (int i = 0; i < g.vex_num; i++)
{
if (visited[i] == 0 && g.adj[u][i] == 1)
{
cout << i << " ";
g.v[i].parent = u;
DFS_Visit(g, i);
}
}
visited[u] = 2;
time = time + 1;
g.v[u].end = time;
}
//深度优先
void DFS(Graph & g)
{
for (int i = 0; i < g.vex_num; i++)
{
visited[i] = 0;
}
//初始化时间戳信息
time = 0;
for (int i = 0; i < g.vex_num; i++)
{
//该节点未被访问
if (visited[i] == 0)
{
cout << i << " ";
DFS_Visit(g, i);
}
}
}
//非递归深度优先算法
void No_recurisive_DFS(Graph & g,int s)
{
int u;
bool ifend=true;
for (int i = 0; i < g.vex_num; i++)
{
visited[i] = 0;
}
int stack[MaxVNum];
int depth = -1;
depth++;
stack[depth] = s;
visited[s] = 1;
time = time + 1;
g.v[s].start = time;
cout << s << " ";
while (depth >= 0)
{
int u = stack[depth];
ifend = true;
for (int i = 0; i < g.vex_num; i++)
{
if (visited[i] == 0 && g.adj[u][i] == 1)
{
cout << i << " ";
ifend = false;
visited[i] = 1;
g.v[i].parent = u;
time = time + 1;
g.v[i].start = time;
depth++;
stack[depth] = i;
}
}
if (ifend == true)
{
visited[u] = 2;
depth--;
}
}
}
int main()
{
Graph g;
init(g);
//DFS(g);
No_recurisive_DFS(g, 0);
return 0;
}
广度优先算法
#include<iostream>
#include<queue>
using namespace std;
#define MaxVNum 50
#define INFINITYDIS 10000
//adjacency matrix邻接矩阵
typedef double AdjMatrix[MaxVNum][MaxVNum];
int visited[MaxVNum];
int time;//定义深度优先搜索的时间戳
//define the info of vertex
typedef struct
{
int d;//the distance from start vertex
int parent;//define the index of parent node
}vex;
//定义一个结构体的别名Graph
typedef struct
{
int vex_num, arc_num;//the number of vertex,the number of arc
AdjMatrix adj;//define the adjacency matrix of a graph
vex v[MaxVNum];
}Graph;
void init(Graph & g)
{
g.vex_num = 8;
g.arc_num = 9;
for (int i = 0; i < g.vex_num; i++)
{
g.v[i].d = INFINITYDIS;
g.v[i].parent = MaxVNum;
}
//init the adj matrix
for (int i = 0; i < g.vex_num; i++)
{
for (int j = 0; j < g.arc_num; j++)
{
g.adj[i][j] = 0;
}
}
g.adj[0][1] = 1;
g.adj[0][2] = 1;
g.adj[1][3] = 1;
g.adj[1][4] = 1;
g.adj[2][5] = 1;
g.adj[2][6] = 1;
g.adj[3][1] = 1;
g.adj[3][6] = 1;
g.adj[3][7] = 1;
g.adj[4][1] = 1;
g.adj[4][7] = 1;
g.adj[5][2] = 1;
g.adj[5][5] = 1;
g.adj[5][6] = 1;
g.adj[6][2] = 1;
g.adj[6][5] = 1;
g.adj[7][3] = 1;
g.adj[7][4] = 1;
}
//广度优先算法
//@s:从s顶点开始搜索图g
void BFS(Graph & g,int s)
{
//初始化visited,未被访问=0
for (int i = 0; i < g.vex_num; i++)
{
visited[i] = 0;
}
//the start vertex
g.v[s].d = 0;
//开始被访问,访问未完成=1
visited[s] = 1;
queue<int> Q;
Q.push(s);
cout << s << " ";
//若队列不为空
while (!Q.empty())
{
//取出队首元素
int u = Q.front();
Q.pop();
for (int i = 0; i < g.vex_num; i++)
{
//和u节点有边,且该节点未被访问过
if (g.adj[u][i] == 1 && visited[i] == 0)
{
cout << i << " ";
visited[i] = 1;
g.v[i].parent = u;
g.v[i].d = g.v[i].d + 1;
Q.push(i);
}
}
//队首元素u被访问完=2
visited[u] = 2;
}
}
//深度优先搜索每一个节点
void DFS_Visit(Graph & g, int u)
{
visited[u] = 1;
time = time + 1;
g.v[u].d = time;
for (int i = 0; i < g.vex_num; i++)
{
if (visited[i] == 0 && g.adj[u][i] == 1)
{
cout << i << " ";
g.v[i].parent = u;
DFS_Visit(g, i);
}
}
visited[u] = 2;
}
//深度优先
void DFS(Graph & g)
{
for (int i = 0; i < g.vex_num; i++)
{
visited[i] = 0;
}
//初始化时间戳信息
time = 0;
for (int i = 0; i < g.vex_num; i++)
{
//该节点未被访问
if (visited[i] == 0)
{
cout << i << " ";
DFS_Visit(g, i);
}
}
}
int main()
{
Graph g;
init(g);
//DFS(g);
BFS(g, 3);
return 0;
}