图的深度遍历-邻接矩阵实现

深度优先遍历邻接矩阵实现,
详解邻接矩阵表示的图中,如何通过DFS函数进行顶点遍历,包括函数定义、创建图和示例应用。

description

本题要求实现邻接矩阵存储图的深度优先遍历。

函数接口定义:

void DFS(MGraph G,Vertex v);
其中MGraph是邻接矩阵存储的图,定义如下:

#define MaxVertexNum 10 /定义最大顶点数/
typedef int Vertex;/* 用顶点下标表示顶点,为整型 */
typedef struct{
int arcs[MaxVertexNum][MaxVertexNum]; /邻接矩阵/
int vexnum,arcnum; /图中的顶点数vexnum和边数arcnum/
}MGraph; /用邻接矩阵表示的图的类型/
裁判测试程序样例:


#include"stdio.h"
#include"stdlib.h"
typedef enum{FALSE,TRUE} Boolean;
#define MaxVertexNum 10     /*定义最大顶点数*/
typedef int Vertex;/* 用顶点下标表示顶点,为整型 */
typedef struct{
    int arcs[MaxVertexNum][MaxVertexNum]; /*邻接矩阵*/
    int vexnum,arcnum; /*图中的顶点数vexnum和边数arcnum*/
}MGraph; /*用邻接矩阵表示的图的类型*/
Boolean visited[MaxVertexNum]; /* 顶点的访问标记 */
void CreatMGraph(MGraph *G);/* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void DFS(MGraph G,Vertex v);
int main()
{
    Vertex v;
    MGraph G;
    CreatMGraph(&G);
    scanf("%d", &v);
    printf("DFS from %d:",v);
    DFS(G,v);     
    return 0;
}
/* 你的代码将被嵌在这里 */

对于给定图:
在这里插入图片描述

输入样例:

第一行给出图的顶点数n和边数e,随后e行,每行给出一条边的两个顶点编号,最后一行给出遍历的起始顶点编号。

7 9
0 2
0 3
0 4
1 3
1 5
2 3
2 5
4 5
5 6
5

输出样例:

DFS from 5: 5 1 3 0 2 4 6

solution

void DFS(MGraph G,Vertex v){
	printf(" %d", v);
	visited[v] = TRUE;
	for(int i = 0; i < G.vexnum; i++){
		if(G.arcs[v][i] && !visited[i] )
			DFS(G, i);
	}
}
### 深度优先遍历(DFS)算法 #### 深度优先搜索的基本思想 深度优先搜索是一种用于遍历或搜索树或算法。该算法会尽可能深入地探索每一个分支,直到无法继续为止,此时再回溯至上一个节点并重复此过程直至所有节点都被访问过[^1]。 对于基于邻接矩阵存储的而言,在执行DFS时,通过检查矩阵中的对应位置来判断两个顶点间是否存在边连接。如果存在,则标记该顶点已访问,并将其作为新的起点递归调用DFS函数;反之则尝试下一个可能的方向。 #### DFS算法伪代码描述 ```plaintext procedure DFS(G, v) is label v as discovered for all directed edges from v to w that are in G.adjacentEdges(v) do if vertex w is not labeled as discovered then recursively call DFS(G, w) ``` 上述伪代码适用于一般情况下的无向或有向。当具体应用到邻接矩阵表示法下时,`G.adjacentEdges(v)`可以通过直接读取第v行的数据来进行替代操作。 #### 使用C++实现的完整示例代码 下面给出了一段完整的C++程序,它实现了针对给定邻接矩阵形式表达的进行深度优先遍历的功能: ```cpp #include <iostream> using namespace std; class Graph { private: int V; // Number of vertices bool **adjMatrix; public: Graph(int V); ~Graph(); void addEdge(int src, int dest); void DFSUtil(int v, bool visited[]); void DFS(int v); }; // Constructor and Destructor definitions... Graph::Graph(int V){ this->V = V; adjMatrix = new bool*[V]; for (int i=0;i<V;++i) adjMatrix[i]=new bool[V]{false}; } Graph::~Graph(){ delete[] *adjMatrix; } void Graph::addEdge(int src, int dest){ adjMatrix[src][dest] = true; adjMatrix[dest][src] = true; // For undirected graph only. } void Graph::DFSUtil(int v, bool visited[]){ // Mark the current node as visited and print it visited[v] = true; cout << v << " "; // Recur for all the vertices adjacent to this vertex for (int u = 0;u<V;++u) if (!visited[u] && adjMatrix[v][u]) DFSUtil(u , visited); } void Graph::DFS(int v){ // Initialize all vertices as not visited bool *visited = new bool[V]{false}; // Call recursive helper function to print DFS traversal DFSUtil(v, visited); // Clean up dynamically allocated memory delete [] visited; } // Driver code can be added here... ``` 这段代码展示了如何创建一个简单的类 `Graph` 来管理结构以及其上的DFS操作。注意这里的例子假设了一个无向的情况,因此在添加边的时候进行了双向设置[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值