Undirected Graph BFS/DFS

本文探讨了无向图中的广度优先搜索(BFS)与深度优先搜索(DFS)算法实现细节,包括如何避免重复访问节点以及利用hashmap提高访问效率等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

无向图BFS

Clone Graph

(1) BFS无向图需要有一个set visted,为什么树没有?因为图中可能会重复访问(又回去)。

每次我们只考虑set中没有的node:注意,需要一个queue一个set,其它和bfs一个tree一样的。

(2) hashmap这里主要是用于加快访问速度O(1),每次不用去list里面重新找node。


(1) DFS做法:

每次我们只考虑set中没有的node,我们需要一个set,就不用stack了,直接递归调用即可。

好的,下面是对于无向图的创建、DFSBFS的C语言实现代码: // 定义无向图结构体 typedef struct _UndirectedGraph { int vertexNum; // 顶点个数 int **edgeMatrix; // 邻接矩阵 } UndirectedGraph; // 创建无向图 UndirectedGraph *createUndirectedGraph(int vertexNum) { UndirectedGraph *graph = (UndirectedGraph *) malloc(sizeof(UndirectedGraph)); graph->vertexNum = vertexNum; // 初始化邻接矩阵 graph->edgeMatrix = (int **) malloc(vertexNum * sizeof(int *)); for (int i = 0; i < vertexNum; i++) { graph->edgeMatrix[i] = (int *) malloc(vertexNum * sizeof(int)); memset(graph->edgeMatrix[i], 0, vertexNum * sizeof(int)); } return graph; } // 添加边 void addEdge(UndirectedGraph *graph, int vertex1, int vertex2) { graph->edgeMatrix[vertex1][vertex2] = 1; graph->edgeMatrix[vertex2][vertex1] = 1; } // DFS遍历 void DFS(UndirectedGraph *graph, int startVertex, int *visited) { visited[startVertex] = 1; printf("%d ", startVertex); for (int i = 0; i < graph->vertexNum; i++) { if (graph->edgeMatrix[startVertex][i] == 1 && !visited[i]) { DFS(graph, i, visited); } } } // BFS遍历 void BFS(UndirectedGraph *graph, int startVertex, int *visited) { int queue[graph->vertexNum]; int front = 0, rear = 0; visited[startVertex] = 1; queue[rear++] = startVertex; while (front < rear) { int vertex = queue[front++]; printf("%d ", vertex); for (int i = 0; i < graph->vertexNum; i++) { if (graph->edgeMatrix[vertex][i] == 1 && !visited[i]) { visited[i] = 1; queue[rear++] = i; } } } } // 示例程序 int main() { UndirectedGraph *graph = createUndirectedGraph(5); addEdge(graph, 0, 1); addEdge(graph, 0, 2); addEdge(graph, 1, 2); addEdge(graph, 2, 3); addEdge(graph, 3, 4); int visited[graph->vertexNum]; memset(visited, 0, graph->vertexNum * sizeof(int)); printf("DFS: "); DFS(graph, 0, visited); printf("\n"); memset(visited, 0, graph->vertexNum * sizeof(int)); printf("BFS: "); BFS(graph, 0, visited); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值