图相关代码

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);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值