DFS算法---递归实现
有图如下所示:
得表如下所示:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
a | b | c | d | e | f | g | h | ||
0 | a | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
1 | b | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | c | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
3 | d | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
4 | e | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
5 | f | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 |
6 | g | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
7 | h | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
上代码:
#include "iostream"
#include "memory.h"
int Graph[8][8] = {0};
int isVisited[8] = {0};
int arcArr[10][2] =
{
{1, 0},
{2, 0},
{3, 0},
{4, 2},
{5, 2},
{5, 3},
{5, 4},
{6, 5},
{7, 3},
{7, 6}
};
void DFS_Graph( int (*G)[8], int n)
{
std::cout << n << " ";
isVisited[n] = 1;
for(int scanCount = 0; scanCount < 8; scanCount++)
{
if(G[n][scanCount] == 1 && isVisited[scanCount] == 0)
{
int tempCount = scanCount;
DFS_Graph(G, tempCount);
}
}
}
void init_Graph(void)
{
int j = 0;
for(int i = 0; i < 8; i++)
{
while(arcArr[j][0] == i)
{
Graph[i][arcArr[j][1]] = 1;
Graph[arcArr[j][1]][i] = 1;
j++;
}
}
for(int i = 0; i < 8; i++)
{
for(int j = 0; j < 8; j++)
{
std::cout << Graph[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
void dfs_Test(void)
{
init_Graph();
for(int i = 0; i < 8; i++)
{
DFS_Graph(Graph, i);
memset(isVisited, 0, sizeof(isVisited));
std::cout << std::endl;
}
}
运行结果如下所示:
下面是图的广度优先遍历:
同样是这个图,我们需要用队列的方式来完成广度遍历,下面上示例代码:
int arcArr[10][2] =
{
{1, 0},
{2, 0},
{3, 0},
{4, 2},
{5, 2},
{5, 3},
{5, 4},
{6, 5},
{7, 3},
{7, 6}
};
typedef struct
{
int QuArr[50];
uint8_t rear;
uint8_t head;
}UsrQuene;
typedef struct
{
int GraphArr[8][8];
int isVisited[8];
int numVetex, numArc;
}GraphA;
void initGraphA(GraphA *GrA, UsrQuene *QueA)
{
GrA->numVetex = 8;
GrA->numArc = 10;
memset(GrA->isVisited, 0, 8*sizeof(int));
int j = 0;
memset(GrA->GraphArr, 0, 64 * sizeof(int));
for(int i = 0; i < GrA->numVetex; i++)
{
while(i == arcArr[j][0])
{
GrA->GraphArr[i][arcArr[j][1]] = 1;
GrA->GraphArr[arcArr[j][1]][i] = 1;
j++;
}
}
for(int i = 0; i < 8; i++)
{
for(int j = 0; j < 8; j++)
{
std::cout << GrA->GraphArr[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
QueA->rear = QueA->head = 1;
memset(QueA->QuArr, 0, 50 * sizeof(int));
}
int QueEmpty(UsrQuene *Q)
{
if(Q->head == Q->rear)
{
return 1;
}
return 0;
}
int QueFull(UsrQuene *Q)
{
if(Q->rear == 49)
{
return 1;
}
return 0;
}
int pushUsrQue(UsrQuene *Q, int e)
{
if(QueFull(Q))
{
return 0;
}
Q->QuArr[Q->rear] = e;
Q->rear++;
return 1;
}
int pullUsrQue(UsrQuene *Q, int *e)
{
if(QueEmpty(Q))
{
return 0;
}
*e = Q->QuArr[Q->head];
Q->head++;
return 1;
}
void BFS_Graph(GraphA *G, UsrQuene *Q, int i)
{
//G->isVisited[i] = 1;
//std::cout << i << " ";
pushUsrQue(Q, i);
G->isVisited[i] = 1;
int eleTemp = 0;
while(!QueEmpty(Q))
{
//G->isVisited[Q->QuArr[Q->head]] = 1;
pullUsrQue(Q, &eleTemp);
std::cout << eleTemp << " ";
for(int i = 0; i < G->numVetex; i++)
{
if(G->GraphArr[eleTemp][i] != 0 && G->isVisited[i] == 0)
{
pushUsrQue(Q, i);
G->isVisited[i] = 1;
}
}
}
}
void bfs_Test(void)
{
GraphA G;
UsrQuene Q;
initGraphA(&G, &Q);
for (int i = 0; i < 8; i++)
{
BFS_Graph(&G, &Q, i);
memset(G.isVisited, 0 , 8 * sizeof(int));
memset(Q.QuArr, 0, 50 * sizeof(int));
Q.head = Q.rear = 0;
std::cout << std::endl;
}
}
完成后结果如下图所示