图相关代码

Graph.h

//
//  Graph.hpp
//  FirstP
//
//  Created by 赫赫 on 2023/11/1.
//

#ifndef Graph_hpp
#define Graph_hpp
#define MaxVertexNum 100    //顶点数目最大值
#define INFINITY 99999  //表示不连通

#include 
#include 
#include 
#include 
#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=0;w=NextNeighbor(G, v, w)){
        if(!visited[w]){
            DFS(G,w);
        }
    }
}
//对于多个连通子图组成的图的遍历
void DFSTraverse(ALGraph G){
    for(int v=0;v

你可能感兴趣的:(数据结构,深度优先,算法)