8648 图的深度遍历

ops/2024/10/5 18:00:23/

### 思路
1. **图的邻接表存储结构**:使用邻接表存储图的顶点和边信息。
2. **基本操作函数**:包括创建图、查找顶点、获取顶点值、获取第一个邻接顶点、获取下一个邻接顶点等。
3. **深度优先遍历(DFS)**:从某个顶点出发,递归地访问所有未访问的邻接顶点。

### 伪代码
1. **创建图**:
   - 读取图的类型、顶点数和边数。
   - 初始化顶点信息和邻接表。
   - 读取每条边的信息,更新邻接表。

2. **深度优先遍历(DFS)**:
   - 初始化访问标志数组。
   - 对每个未访问的顶点调用DFS函数。
   - 在DFS函数中,标记当前顶点为已访问,并递归访问所有未访问的邻接顶点。

### C++代码
 

#include "string.h"
#include "malloc.h"
#include "stdio.h"
#include "stdlib.h"typedef int InfoType;
#define MAX_NAME 3
typedef char VertexType[MAX_NAME];
#define MAX_VERTEX_NUM 20
typedef enum { DG, DN, AG, AN } GraphKind;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;InfoType *info;
} ArcNode;typedef struct {VertexType data;ArcNode *firstarc;
} VNode, AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum, arcnum;int kind;
} ALGraph;int LocateVex(ALGraph G, VertexType u) {for (int i = 0; i < G.vexnum; ++i)if (strcmp(u, G.vertices[i].data) == 0)return i;return -1;
}void CreateGraph(ALGraph *G) {int i, j, k, w;VertexType va, vb;ArcNode *p;scanf("%d", &(*G).kind);scanf("%d%d", &(*G).vexnum, &(*G).arcnum);for (i = 0; i < (*G).vexnum; ++i) {scanf("%s", (*G).vertices[i].data);(*G).vertices[i].firstarc = NULL;}for (k = 0; k < (*G).arcnum; ++k) {if ((*G).kind == 1 || (*G).kind == 3)scanf("%d%s%s", &w, va, vb);elsescanf("%s%s", va, vb);i = LocateVex(*G, va);j = LocateVex(*G, vb);p = (ArcNode *)malloc(sizeof(ArcNode));p->adjvex = j;if ((*G).kind == 1 || (*G).kind == 3) {p->info = (int *)malloc(sizeof(int));*(p->info) = w;} else {p->info = NULL;}p->nextarc = (*G).vertices[i].firstarc;(*G).vertices[i].firstarc = p;if ((*G).kind >= 2) {p = (ArcNode *)malloc(sizeof(ArcNode));p->adjvex = i;if ((*G).kind == 3) {p->info = (int *)malloc(sizeof(int));*(p->info) = w;} else {p->info = NULL;}p->nextarc = (*G).vertices[j].firstarc;(*G).vertices[j].firstarc = p;}}
}VertexType *GetVex(ALGraph G, int v) {if (v >= G.vexnum || v < 0)exit(0);return &G.vertices[v].data;
}int FirstAdjVex(ALGraph G, VertexType v) {int v1 = LocateVex(G, v);ArcNode *p = G.vertices[v1].firstarc;if (p)return p->adjvex;elsereturn -1;
}int NextAdjVex(ALGraph G, VertexType v, VertexType w) {int v1 = LocateVex(G, v);int w1 = LocateVex(G, w);ArcNode *p = G.vertices[v1].firstarc;while (p && p->adjvex != w1)p = p->nextarc;if (!p || !p->nextarc)return -1;elsereturn p->nextarc->adjvex;
}int visited[MAX_VERTEX_NUM];
void (*VisitFunc)(char *v);void DFS(ALGraph G, int v) {visited[v] = 1;VisitFunc(G.vertices[v].data);for (int w = FirstAdjVex(G, G.vertices[v].data); w >= 0; w = NextAdjVex(G, G.vertices[v].data, G.vertices[w].data)) {if (!visited[w])DFS(G, w);}
}void DFSTraverse(ALGraph G) {for (int i = 0; i < G.vexnum; i++)visited[i] = 0;VisitFunc = print;for (int i = 0; i < G.vexnum; i++) {if (!visited[i])DFS(G, i);}printf("\n");
}void print(char *i) {printf("%s ", i);
}int main() {ALGraph g;CreateGraph(&g);DFSTraverse(g);return 1;
}

### 总结
该代码实现了图的邻接表存储结构,并提供了基本操作函数和深度优先遍历算法。通过输入图的类型、顶点数、边数和边的信息,构建图的邻接表,并进行深度优先遍历,输出遍历结果。


http://www.ppmy.cn/ops/121525.html

相关文章

Python人工智能使用OpenCV进行图片形状的中心检测

我们都知道正方形(长方形)的中心是2条对角线的交点,圆的中心是一个圆的圆心,如何在对象检测以及图片检测与识别领域,判断一个形状的中心,便是计算机视觉领域中的一个基础检测 中心检测 Opencv+python 实现物体形状的质心检测 OpenCV(Open Source Computer Vision Libr…

解决磁盘负载不均——ElasticSearch 分片分配和路由设置

ES 分片分配&#xff08;Shard Allocation&#xff09;时间点&#xff1a; 初始恢复&#xff08;Initial Recovery&#xff09;副本分配&#xff08;Replica Allocation&#xff09;重平衡&#xff08;Rebalance&#xff09;节点添加或移除 小结&#xff1a; 准备移除节点时&a…

【JavaEE】JVM

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f4d4; 一.概念 Java虚拟机&#xff08;JVM, Java Virtual Machine&#xff09;是Java平台的核心组件&#xff0c;它使得Java程序可以在任何安装了JVM的…

扩展可持续性概念:太空移民、持久产品与人类未来

可持续性的扩展概念&#xff1a;超越绿色能源&#xff0c;关乎人类未来的延续 当我们听到“可持续性”这个词时&#xff0c;大多数人首先想到的是环境保护、绿色能源、减少碳足迹或保护生态系统。虽然这些都是不可忽视的重要部分&#xff0c;但可持续性远远超出了绿色能源的范…

MATLAB使用眼图分析QPSK通信系统接收端匹配滤波后的信号

文章目录 前言一、MATLAB仿真代码二、仿真结果 前言 本文完成以下内容&#xff1a; &#xff08;1&#xff09;建立一个QPSK传输系统&#xff0c;并引入EsNo20dB&#xff08;SNR0dB&#xff09;的噪声&#xff0c;接收端对带噪信号进行匹配滤波。 &#xff08;2&#xff09;分…

需求6:如何写一个后端接口?

这两天一直在对之前做的工作做梳理总结&#xff0c;不过前两天我都是在总结一些bug的问题。尽管有些bug问题我还没写文章&#xff0c;但是&#xff0c;我今天不得不先停下对bug的总结了。因为在国庆之后&#xff0c;我需要自己开发一个IT资产管理的功能&#xff0c;这个功能需要…

无IDEA不Java:快速掌握Java集成开发环境

IntelliJ IDEA是一种强大的Java集成开发环境&#xff0c;是Java开发人员的首选工具之一。本文将介绍IDEA的基本使用方法和常用功能&#xff0c;以帮助初学者快速上手。 安装和配置 首先&#xff0c;需要下载并安装IntelliJ IDEA。在安装完成后&#xff0c;需要配置JDK&#xff…

C++匿名对象的介绍

文章目录 目录 文章目录前言一、对匿名对象的解读二、匿名对象的对象类型三、匿名对象的使用总结 前言 在C中&#xff0c;匿名对象是指在没有呗命名的情况下创建的临时对象。它们通常在单个语句中执行一系列操作或调用某个函数&#xff0c;并且不需要将结果存放进变量中。 匿名…