#define MAXVEX 100 //最大顶点数
bool visited[MAXVEX];
typedef struct main
{
int vexs[MAXVEX]; //顶点表,记录顶点信息,可以用vector记录,数据类型可根据具体情况确定
int arc[MAXVEX][MAXVEX]; //邻接矩阵,可以使用vector<vector<int>>定义
int numVertexes, numEdges; //顶点数和边数
} MGraph;
//图的遍历主要有基于递归思想的深度优先递归算法和基于队列的广度遍历算法
/***********深度优先递归算法****************/
//邻接矩阵的深度优先递归算法
void DFS(MGraph G, int i)
{
visited[i] = true;
printf("%c", G.vexs[i]); //打印顶点信息,也可以对顶点进行其他操作
for (int j = 0; j < G.numVertexes; j++)
{
if (G.arc[i][j] == 1 && !visited[j]) //对为访问的邻接顶点递归调用
DFS(G, j);
}
}
void DFSTraverse(MGraph G)
{
for (int i = 0; i < G.numVertexes; i++)
{
visited[i] = false; //初始将所有的顶点状态都设置为未访问状态
}
for (int i = 0; i < G.numVertexes; i++)
{
if (!visited[i]) //对未访问过的顶点调用DFS,若是连通图,则只执行依次DFS;若为非连通图,则有几个子图就执行几次
DFS(G, i);
}
}
//邻接表的深度遍历操作,如果图结构是邻接表结构,其DFSTraverse函数的代码几乎是相同的,知识递归函数中因为将数组变成了链表而不同
//GraphAdjList为邻接表结构,EdgeNode为边表节点
//边表结构
typedef struct EdgeNode
{
int adjvex; //邻接点域,存储该顶点对应的下标
int weight; //存储权值
struct EdgeNode *next; //链表,指向下一个邻接点
} EdgeNode;
//顶点表结构
typedef struct VertexNode
{
char data; //顶点域,存储顶点信息,数据类型自定义
EdgeNode *firstedge; //边表头指针
} VertexNode, AdjList[MAXVEX];
typedef struct
{
AdjList adjList;
int numVertexes, numEdges;
} GraphAdjList;
void DFS(GraphAdjList GL, int i)
{
EdgeNode *p;
visited[i] = true;
printf("%c", GL->adjList[i].data); //打印顶点信息,也可以对顶点进行其他操作
p = GL->adjList[i].firstedge;
while (p)
{
if (!visited[p->adjvex])
DFS(GL, p->adjvex); //对为访问的邻接顶点递归调用
p = p->next;
}
}
void DFSTraverse(MGraph G)
{
for (int i = 0; i < G.numVertexes; i++)
{
visited[i] = false; //初始将所有的顶点状态都设置为未访问状态
}
for (int i = 0; i < G.numVertexes; i++)
{
if (!visited[i]) //对未访问过的顶点调用DFS,若是连通图,则只执行依次DFS;若为非连通图,则有几个子图就执行几次
DFS(G, i);
}
}
/***********深度优先递归算法****************/
//邻接矩阵的广度优先递归算法
void DFSTraverse(MGraph G)
{
queue<int> Q; //队列存储的是顶点信息的下标
vector<bool> visited(G.numVertexes, false); //初始化顶点状态为未访问
for (int i = 0; i < G.numVertexes; i++)
{ //多个子图的话需要循环每个子图
if (!visited[i]) //如果是连通图,则只要运行一次
{ //若是未访问就进行处理
visited[i] = true; //设置当前节点访问过
printf("%c", G.vexs[i]); //打印访问的顶点信息,可对该顶点进行其他操作
Q.push(i); //该顶点入队列
while (!Q.empty())
{
i = Q.front();
Q.pop();
for (int j = 0; j < G.numVertexes; j++)
{
//判断其他节点若与当前顶点存在边且未被访问过
if (G.arc[i][j] == 1 && !visited[j])
{
visited[j] = true;
printf("%c", G.vexs[j]); //打印访问的顶点信息,可对该顶点进行其他操作
Q.push(j); //将找到的顶点入队列
}
}
}
}
}
}
图的遍历——主要有基于递归思想的深度优先递归算法和基于队列的广度遍历算法
最新推荐文章于 2022-05-14 22:57:00 发布