DFS \BFS生成树
根据给定文件中的标题“DFS \BFS生成树”、描述以及部分代码内容,我们可以提炼出以下几个关键知识点:邻接表、深度优先搜索(Depth-First Search, DFS)、广度优先搜索(Breadth-First Search, BFS)以及如何利用这两种搜索算法生成树或森林。 ### 1. 邻接表 邻接表是一种用于存储图数据结构的数据结构。它通过一系列链表来表示图中各个顶点的相邻关系。对于无向图,如果顶点\( v_i \)与顶点\( v_j \)相连,则在\( v_i \)的链表中会有一个指向\( v_j \)的指针,在\( v_j \)的链表中也会有一个指向\( v_i \)的指针;对于有向图,则只会在起点的链表中添加一个指向终点的指针。 ### 2. 深度优先搜索(DFS) #### 2.1 DFS算法原理 DFS是一种遍历或搜索树或图的算法。其基本思想是从图中某个顶点\( v \)出发,首先访问\( v \),然后选择一个与\( v \)相邻且未被访问过的顶点\( w \)继续进行深度优先搜索,直到当前路径无法深入时,才回溯到上一个节点继续探索。DFS可以用来解决很多问题,比如寻找连通分量、判断环路的存在等。 #### 2.2 DFS生成树 DFS可以用来生成一棵树或森林。当从某个顶点开始执行DFS时,每遇到一个未被访问过的顶点,就将该顶点加入到树中。最终形成的树被称为DFS生成树。如果图是连通的,则生成一棵树;如果图不是连通的,则生成森林。 #### 2.3 DFS代码实现 ```c typedef enum {FALSE, TRUE} Boolean; Boolean visited[MaxVertexNum]; void DFSTraverseTREE(ALGraph* G) { for (int i = 0; i < G->n; i++) visited[i] = FALSE; for (int i = 0; i < G->n; i++) if (!visited[i]) DFSTree(G, i); } void DFSTree(ALGraph* G, int i) { visited[i] = TRUE; EdgeNode* p = G->adjlist[i].firstedge; while (p) { if (!visited[p->adjvex]) { printf("(%c, %c)\n", G->adjlist[i].vertex, G->adjlist[p->adjvex].vertex); DFSTree(G, p->adjvex); } p = p->next; } } ``` ### 3. 广度优先搜索(BFS) #### 3.1 BFS算法原理 BFS同样是一种遍历或搜索树或图的算法。其基本思想是从图中某个顶点\( v \)出发,首先访问\( v \),然后依次访问所有与\( v \)相邻的顶点,再依次访问它们的所有未被访问过的相邻顶点,以此类推。BFS通常使用队列来管理待访问的顶点。 #### 3.2 BFS生成树 BFS也可以用来生成一棵树或森林。与DFS类似,当从某个顶点开始执行BFS时,每遇到一个未被访问过的顶点,就将该顶点加入到树中。最终形成的树被称为BFS生成树。 #### 3.3 BFS代码实现 ```c void BFSTraverseTREE(ALGraph* G) { for (int i = 0; i < G->n; i++) visited[i] = FALSE; for (int i = 0; i < G->n; i++) if (!visited[i]) BFSTree(G, i); } void BFSTree(ALGraph* G, int k) { CirQueue Q; InitQueue(&Q); visited[k] = TRUE; EnQueue(&Q, k); while (!QueueEmpty(&Q)) { int i = DeQueue(&Q); EdgeNode* p = G->adjlist[i].firstedge; while (p) { if (!visited[p->adjvex]) { printf("(%c, %c)\n", G->adjlist[i].vertex, G->adjlist[p->adjvex].vertex); visited[p->adjvex] = TRUE; EnQueue(&Q, p->adjvex); } p = p->next; } } } ``` 以上就是关于DFS和BFS生成树的相关知识点。这两种算法都是非常基础且重要的图论算法,对于理解图的各种特性非常有帮助。
答:
(1)求DFS生成树
typedef enum{FALSE,TRUE}Boolean;//FALSE为0,TRUE为1
Boolean visited[MaxVertexNum]; //访问标志向量是全局量
void DFSTraverseTREE(ALGraph *G)
{ //求深度优先生成树(以邻接表表示的图G),而以邻接矩阵表示G时,
//算法完全与此相同,只要将DFSTree(G,i)改为DFSMTree(G,i)即可
int i;
for(i=0;i<G->n;i++)
visited[i]=FALSE; //标志向量初始化
for(i=0;i<G->n;i++)
if(!visited[i]) //vi未访问过
DFSTree(G,i); //以vi为源点开始DFS搜索,求DFS生成树的边
}//DFSTraverse
void DFSTree(ALGraph *G,int i){
//以vi为出发点对邻接表表示的图G进行深度优先搜索,打印生成树(生成森林)的边
EdgeNode *p;
visited[i]=TRUE; //标记vi已访问
p=G->adjlist[i].firstedge; //取vi边表的头指针
while(p){//依次搜索vi的邻接点vj,这里j=p->adjvex
if (!visited[p->adjvex])//若vj尚未被访问
{printf("(%c,%c)\n",G->adjlist[i].vertex,G->adjlist[p->adjvex].vertex) ;
// 打印边
DFSTree(g,p->adjvex);//则以Vj为出发点向纵深搜索
}
p=p->next; //找vi的下一邻接点
}
- Mr_baicai2013-12-12还好,因为在学习这个算法,所以对我的学习还是起到了帮助
- a2919011912012-08-16很好的把基础知识整合在一起
- 粉丝: 1
- 资源: 21
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助