Graph.h
//
// Graph.hpp
// FirstP
//
// Created by 赫赫 on 2023/11/1.
//
#ifndef Graph_hpp
#define Graph_hpp
#define MaxVertexNum 100 //顶点数目最大值
#define INFINITY 99999 //表示不连通
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include "Queue.hpp"
using namespace std;
#endif /* Graph_hpp */
//图的存储结构-邻接矩阵-表示法唯一
typedef struct{
char Vex[MaxVertexNum]; //顶点信息
int Edge[MaxVertexNum][MaxVertexNum]; //边信息
int vexnum,arcnum; //图的当前顶点数,弧数
}MGraph;
//图的存储结构-邻接表-表示法不唯一
//结点信息放在数组,每一个结点后面都包含着这个结点边的信息
//边链表结点
typedef struct ArcNode{
int adjvex; //边指向的结点在数组的下标
struct ArcNode *next; //下一条关联的边
}ArcNode;
//顶点列表
typedef struct VNode{
char info;
ArcNode *first;//指向第一条关联的边
}VNode,AdjList[MaxVertexNum];
//邻接表定义
//空间复杂度:有向图O(N+E) 无向图O(N+2E)
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
//--------------遍历操作(使用的存储结构为邻接表)-伪代码
//访问顶点列表中下标为v的顶点元素
void visit(int v);
//查找第一个相邻节点
int FirstNeighbor(ALGraph G,int v);
//查找下一个相邻节点,w是当前的邻接点
int NextNeighbor(ALGraph G,int v,int w);
//广度优先遍历(利用队列)
void BFS(ALGraph G,int v);
void BFSTraverse(ALGraph G);
//深度优先遍历(递归实现)
void DFS(ALGraph G,int v);
void DFSTraverse(ALGraph G);
Graph.cpp
//
// Graph.cpp
// FirstP
//
// Created by 赫赫 on 2023/11/1.
//
#include "Graph.hpp"
//访问顶点列表中下标为v的顶点元素
void visit(int v){
}
//查找第一个相邻节点
int FirstNeighbor(ALGraph G,int v){
return 0;
}
//查找下一个相邻节点,w是当前的邻接点
int NextNeighbor(ALGraph G,int v,int w){
return 0;
}
//---------------------代码重点
bool visited[MaxVertexNum];//标记是否已经完成访问顶点
SeqQueue Q;
//广度优先遍历(利用队列)
//只是对于连通图
void BFS(ALGraph G,int v){
visit(v); //访问当前结点
visited[v]=true; //修改访问标记列表
EnQueue(Q, v);
while(!isEmpty(Q)){
DeQueue(Q, v);
//遍历当前结点的所有相连结点
for(int w=FirstNeighbor(G, v);w>=0;w=NextNeighbor(G, v, w)){
if(!visited[w]){
visit(w);
visited[w]=true;
EnQueue(Q, w);
}
}
}
}
//对于多个连通子图组成的图的遍历
void BFSTraverse(ALGraph G){
//先对访问标记列表初始化
for(int i=0;i<G.vexnum;i++){
visited[i]=false;
}
InitQueue(Q);
//可以解决BFS只能遍历连通图的问题
for(int i=0;i<G.vexnum;i++){
if(!visited[i]){
BFS(G,i);
}
}
}
//深度优先遍历(递归实现)
//对于连通图
void DFS(ALGraph G,int v){
visit(v);
visited[v]=true;
for(int w=FirstNeighbor(G, v);w>=0;w=NextNeighbor(G, v, w)){
if(!visited[w]){
DFS(G,w);
}
}
}
//对于多个连通子图组成的图的遍历
void DFSTraverse(ALGraph G){
for(int v=0;v<G.vexnum;v++){
visited[v]=false;
}
for(int v=0;v<G.vexnum;v++){
if(!visited[v]){
DFS(G,v);
}
}
}