一步两步学算法之图的深度搜素

DFS 与BFS 的不同之处 直接采用递归 从一个点的邻点直接向下搜索 而不是一个点的所有邻点 。可以把BFS想成一张网  DFS相当于一条路走到黑走不通再换别的路

DFS比BFS更容易理解

 1 void DFSraverse(MatrixGraph *G)
 2 {
 3     int i;
 4     for(i=0;i<G->VertexNum;i++)
 5         G->IsTrav[i]=0;
 6     printf("深度优先遍历节点");
 7     for(i=0;i<G->VertexNum;i++)
 8         if(!G->IsTrav[i])
 9             DFSM(G,i);
10     printf("\n");
11
12 }
13
14 void BFSM(MatrixGraph *G,int i)
15 {
16     int j;
17     G->IsTrav[i]=1;
18     printf("->%c",G->Vertex[i]);
19     for(j=0;j<G->VertexNum;j++)
20         if(G->Edges[i][j]!=MAXVALUE &&!G->IsTrav[i])
21         {
22             DFSM(G,j);
23         }
24 }
时间: 2024-08-30 06:58:11

一步两步学算法之图的深度搜素的相关文章

一步两步学算法之图的广度搜索

bfs利用队列搜索    详细看代码 #define VERTEX_MAX 26 //图的最大定点数 #define MAXVALUE 32767 //最大值 #include "stdio.h" #define QUEUE_MAXSIZE 10 //队列最大容量 typedef struct { char Vertex[VERTEX_MAX]; //保存定点信息的数组 int Edges[VERTEX_MAX][VERTEX_MAX]; //边的权 int IsTrav[VERTEX

一步两步学算法之图邻接表实现

图的邻接表实现 这种结构创建邻接表时添加节点较为绕 建议断点调试下看看 邻接表和邻接矩阵相比 邻接表节省空间但是很难判断两个节点之间是否有边  此种结构要在稀疏图下才划算 下面是代码 1 #define VERTEX_MAX 20 2 #include "stdio.h" 3 #include "malloc.h" 4 typedef struct edgeNode 5 { 6 int Vertex; //顶点序号 7 int weight; 8 struct ed

一步两步学算法之哈夫曼编码(最优二叉树)

比较难理解的 都打了备注了 1 #include "stdio.h" 2 #include "stdlib.h" 3 #include "string.h" 4 char alphabet[]={'A','B','C','D'}; 5 typedef struct 6 { 7 int weight; //权值 8 int parent; //父节点序号 9 int left ; 10 int right; 11 }HuffmanTree; 12

一步两步学算法之树的遍历 非递归实现

递归的程序其实我觉得可读性较高  但是执行效率低下 为了做一道PAT的题 去理解了下非递归实现树的遍历 用一个栈来实现 先序遍历 先访问节点 再把节点push进栈 再访问 再push 直到next=NULL 然后pop出一个节点 也就是弹出一个节点 访问它的右边 再弹出 在访问 中序遍历 把左边节点全部push进栈 然后弹出 访问中间 再访问右边  再弹出 一直循环 后序遍历 比较难理解  要入两次栈才能访问 先左边全部入栈  栈顶是左边的元素 此书不能访问 因为右边还没入栈 下面给出先序和后序

一步两步学算法之最小生成树Prim算法

prim就是一个让树长大的过程  弄一个集合   从一个点开始不断向外搜索 找到权值最小的点 放进集合中  从这个集合所连的边再向外找 1 #define USED 0 2 #define NOADJ -1 3 void Prim(MaxtrixGraph G) 4 { 5 int i,j,k,min,sum=0; 6 int weight[VERTEX_MAX]; 7 char tmpvertex[VERTEX_MAX]; //临时顶点信息 8 9 for(i=1;i<G.VertexNum;

一步两步学算法之中序遍历线索二叉树

1 typedef enum 2 { 3 SubTree, //子树 4 Thread //线索 5 }NodeFlag; 6 7 typedef struct ThreadTree 8 { 9 DATA data; 10 NodeFlag lflag; 11 NodeFlag rflag; 12 struct ThreadTree *left; 13 struct ThreadTree *right; 14 }ThreadBinTree; 15 16 ThreadBinTree *Previo

一步两步学算法之顺序队列

顺序链表代码  非常简单: 但这个代码会有假溢出的状况出现: 就是在队尾已满的情况下,不断出队后 若在此时进行入队操作 判断队列已满的条件是q->head==q->tail 此时这个条件满足. 但实际队列之前已经出队了好几个,前面还有空余空间,这就是假溢出:(原谅我懒得画图) 假溢出解决办法 1.每次出队后 把所有数据都往前移.这种方法要移动大量数据,效率太低. 2.使用循环队列.这种方法明天再打. 1 #define QUEUEMAX 15 2 typedef struct 3 { 4 DA

一步两步学算法之二叉搜索树

Binary Search Tree  又叫二叉查找树,二叉排序树 这是种什么样的树呢? 其实就是根节点的左子树比根节点小  右子树比根节点大  同时 左子树和右子树也是二叉搜索树 代码比较简单 基本用递归实现 比较好理解  只有删除带有左右子树的节点时比较难理解 方法就是 直接在右子树找一个最小的节点 取代要被删除的节点 再继续删除右子树里的节点 详细看代码 1 #include "stdio.h" 2 #include "stdlib.h" 3 typedef

一步两步学算法之操作二叉树

操作二叉树代码比较长    二叉树基本功能在了  注释打的比较少 1 #include "stdio.h" 2 #include "stdlib.h" 3 #define QUEUE_MAXSIZE 50 4 5 typedef char DATA; 6 typedef struct ChainTree 7 { 8 DATA data; 9 struct ChainTree *left; 10 struct ChainTree *right; 11 }ChainBi