DFS
深度优先遍历:
从一个顶点开始,沿着一条路一直走到底,访问过一个顶点,就把这个顶点标记一下。
直到顶点没有出度或者没有还未访问过的顶点了,就回溯到上一个顶点,继续判断,直到访问全部顶点。(递归)
深度优先搜索:
深度优先遍历方法直到找到目标顶点。
图二是根据邻接表画出来的,如果只看第二张图四个选项都可,但是不要忘了,题中的邻接表表示了存储顺序,所以只有一种答案。
从V1开始访问,下一个访问的一定是V5.
V5之后的一定是V4.
V4之后的一定是V7.
V7之后的一定是V6.
V6没有出度了,返回到V7,
V7也没有没访问过的了,返回到V4,
然后依次返回到V1。
因为邻接表中V3比V2先存储,所以访问V3。
V3没有出度,返回到V1.
访问V2,V2没有没访问过的了,所有的结点都访问过,结束。
所以顺序为V1->V5->V4->V7->V6->V3->V2
#include<iostream>
using namespace std;
#define MAXVEX 20
typedef char VertexType;
//边表节点
typedef struct EdgeNode
{
int adjvex;
struct EdgeNode* next;
}EdgeNode;
//顶点表节点
typedef struct VertexNode
{
VertexType data;
EdgeNode* firstedge;
}VertexNode,AdjList[MAXVEX];
typedef struct
{
AdjList adjlist;
int numVertexs, numEdges;
}GraphAdjList;
//创建邻接表
void Creat(GraphAdjList* G)
{
EdgeNode* p;
cout << "输入顶点数和边数:\n";
cin >> G->numVertexs >> G->numEdges;
cout << "输入顶点信息:\n";
for (int i = 0; i < G->numVertexs; i++)
{
cin >> G->adjlist[i].data;
G->adjlist[i].firstedge = NULL;
}
//建立边表
cout << "输入边(vi,vj)的下标i,j\n";
int i, j;
for (int k = 0; k < G->numEdges; k++)
{//有向图前插法
cin >> i >> j;
p = (EdgeNode*)malloc(sizeof(EdgeNode));
p->adjvex = j;
p->next = G->adjlist[i].firstedge;
G->adjlist[i].firstedge = p;
}
//打印邻接表
cout << "邻接表为:\n";
for (int i = 0; i < G->numVertexs; i++)
{
p = G->adjlist[i].firstedge;
while (p)
{
cout << "(" << G->adjlist[i].data << "," << G->adjlist[p->adjvex].data<< ")";
p = p->next;
}
cout << "\n";
}
}
//访问标志的数组,1表示访问过,0表示没访问过
int visited[100];
//邻接表的深度优先遍历算法
void DFS(GraphAdjList* G, int i)
{
EdgeNode* p;
visited[i] = 1;
cout << G->adjlist[i].data << "->";
p = G->adjlist[i].firstedge;
while (p)
{
if (!visited[p->adjvex])
{
DFS(G, p->adjvex);
}
p = p->next;
}
}
//邻接表深度遍历操作
void DFSTraverse(GraphAdjList* G)
{
cout << "深度优先遍历结果为:\n";
for (int i = 0; i < G->numVertexs; i++)
{
visited[i] = 0;
}
for (int i = 0; i < G->numVertexs; i++)
{
if (visited[i] == 0)
{
DFS(G, i);
}
}
}
int main()
{
GraphAdjList G;
Creat(&G);
DFSTraverse(&G);
return 0;
}