【PTA】图的邻接表存储和遍历

目录

1. 题目描述

1.1 输入格式

1.2 输出格式

1.3 输入样例

1.4 输出样例

2. 图的邻接表存储结构

2.1 存储方式

2.2 举例

2.3 特点

3. 图的遍历

3.1 图的遍历的概述

3.2 图的深度优先遍历:DFS

3.2.1 遍历方式

3.2.2 特点

3.2.3 算法

3.3 图的广度优先遍历:BFS

3.3.1 遍历方式

3.3.2 特点

3.3.3 算法

4. 代码实现


【PTA】图的邻接矩阵存储和遍历 https://blog.csdn.net/2301_80216181/article/details/143446819?spm=1001.2014.3001.5501

1. 题目描述

图的邻接表存储用一个一维数组存储各顶点数据元素,用边结点构成的单链表存储元素之间的邻接关系。
 

image.png


如上无向加权图,图中顶点数据元素为“A-Z”之间的单个字符,为了使遍历输出结果唯一,现要求顶点数据元素按由小到大(ASCII码)的顺序存储,单链表中的边结点同样按由小到大有序排列。例如,对于上述加权图,数据元素按照A、B、C、D、E、F、G 的顺序存储,在顶点A的边链表中,第1个是(A,B)边生成的边结点,第2个是(A,D)边生成的边结点。依附于边的权值为整数,且大于0。使用C或C++编写算法,实现:
(1)以领接表为存储结构,按照输入数据建立加权图;
(2)从第1个顶点出发(A),按照深度优先搜索算法输出各顶点数据;
(3)从第1个顶点出发(A),按照广度优先搜索算法输出各顶点数据;
(4)计算并输出个顶点的度,按顶点存储顺序输出。

1.1 输入格式

输入分为以下几行,第1行为图的顶点数,第2行为图的边数,第3行及以后为图的各个边依附的顶点及其权值。

1.2 输出格式

输出分为以下行,第1行为深度优先遍历序列,第2行为广度优先遍历序列,其后为各顶点及其度。

1.3 输入样例

如上图的输入格式为:

7
11
A B 7
A D 5
B C 8
B D 9
B E 7
C E 5
D E 15
D F 6
E F 8
E G 9
F G 11

1.4 输出样例

如上图的输出为:

DFS: A B C E D F G
BFS: A B D C E F G
A:2
B:4
C:2
D:4
E:5
F:3
G:2

其中"DFS:","BFS:","B:","C:"等为提示标志,序列" A B C E D F G"的每个字符前面有一个空格。

代码长度限制:16 KB

时间限制:400 ms

内存限制:64 MB

栈限制:8192 KB

2. 图的邻接表存储结构

2.1 存储方式

        用连续的地址空间存储图的数据元素,用单链表存储元素之间的 邻接 关系。
// 边的定义 
typedef struct ENode{ 
    int V1, V2; // 有向边<V1, V2> 
    int Weight; // 权重 
}ENode, *PtrToENode;
typedef PtrToENode Edge;

// 邻接点的定义 
typedef struct AdjVNode{
    int AdjV; // 邻接点下标 
    int Weight; // 边权重 
    PtrToAdjVNode Next;// 指向下一个邻接点的指针 
}AdjVNode, *PtrToAdjVNode;

// 顶点表头结点的定义 
typedef struct Vnode{
    PtrToAdjVNode FirstEdge; // 边表头指针 
    char Data; // 存顶点的数据 
    // 注意:很多情况下,顶点无数据,此时Data可以不用出现 
} AdjList[MaxVertexNum]; // AdjList是邻接表类型 

// 图结点的定义 
typedef struct GNode{ 
    int Nv; // 顶点数 
    int Ne; // 边数 
    AdjList G; // 邻接表 
}GNode, *PtrToGNode;
typedef PtrToGNode LGraph; // 以邻接表方式存储的图类型 

2.2 举例

### 关于邻接表存储进行广度优先遍历 对于使用邻接表存储结构,在PTA平台上确实存在许多涉及广度优先搜索(BFS)的应用实例。这类题目通常要求理解如何构建操作基于链式前向星或动态数组表示的邻接表。 #### 构建邻接表 为了有效地执行广度优先遍历,首先需要创建一个合适的邻接列表来代表无向或有向中的连接关系。每一项记录指向一系列节点,这些节点是从该项对应的起点出发可以直接到达的目的地[^1]。 ```cpp #include <iostream> #include <vector> using namespace std; const int MAXN = 1e5 + 5; vector<int> adj[MAXN]; // Adjacency list representation of the graph bool visited[MAXN]; void addEdge(int u, int v){ adj[u].push_back(v); } ``` 这段代码展示了初始化邻接表的方式以及添加边的方法。`adj[]` 数组用于保存每一个顶点所关联的所有其他顶点;当给定一对顶点 (u,v),意味着有一条从 u 到 v 的边,则调用 `addEdge(u, v)` 将这条边加入到邻接表中。 #### 执行广度优先遍历 一旦建立了正确的数据结构,就可以利用队列来进行标准的 BFS 过程: ```cpp void bfs(int startNode){ fill(visited, visited+MAXN, false); // Initialize all nodes as unvisited queue<int> q; q.push(startNode); visited[startNode] = true; while (!q.empty()){ int currentNode = q.front(); cout << "Visited node: " << currentNode << endl; q.pop(); for(auto neighbor : adj[currentNode]){ if(!visited[neighbor]){ visited[neighbor]=true; q.push(neighbor); } } } } ``` 此部分实现了基本的广度优先遍历逻辑。它始于指定的一个起始节点 (`startNode`) ,并依次访问其所有未被探索过的邻居节点,直到所有的可达节点都被处理完毕为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值