图遍历的演示
很多涉及图上操作的算法都是以图的遍历操作为基础的。试写一个程序,演示在连通的无向图上访问全部结点的操作。
基本要求
以邻接多重表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。
实现提示
设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。通过输入图的全部边(存于数据文件中,从文件读写)输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制。注意,生成树的边是有向边,端点顺序不能颠倒。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include <stdbool.h> #include <stdio.h> #include <string>
struct Node { int id; struct Node** neighbors; int numNeighbors; bool visited; };
struct Node* createNode(int id) { struct Node* node = (struct Node*)malloc(sizeof(struct Node)); node->id = id; node->neighbors = NULL; node->numNeighbors = 0; node->visited = false; return node; }
void addNeighbor(struct Node* node, struct Node* neighbor) { node->numNeighbors++; node->neighbors = (struct Node**)realloc(node->neighbors, node->numNeighbors * sizeof(struct Node*)); node->neighbors[node->numNeighbors - 1] = neighbor; }
void dfs(struct Node* node) { node->visited = true; printf("访问的节点: %d\n", node->id); for (int i = 0; i < node->numNeighbors; i++) { struct Node* neighbor = node->neighbors[i]; if (!neighbor->visited) { dfs(neighbor); } } }
int main() { struct Node* node1 = createNode(1); struct Node* node2 = createNode(2); struct Node* node3 = createNode(3); struct Node* node4 = createNode(4); struct Node* node5 = createNode(5); addNeighbor(node1, node2); addNeighbor(node1, node3); addNeighbor(node2, node4); addNeighbor(node3, node4); addNeighbor(node4, node5); dfs(node1);
return 0; }
|
1 2 3 4 5
| 访问的节点: 1 访问的节点: 2 访问的节点: 4 访问的节点: 5 访问的节点: 3
|