博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图的深度优先搜索和广度优先搜索
阅读量:6801 次
发布时间:2019-06-26

本文共 2743 字,大约阅读时间需要 9 分钟。

  图论中最粗暴的遍历方式非DFS和BFS莫属了。但是正是这种粗暴的方式,在笔试中被考察的概率非常的大。并且作为压轴题目,成为了一种危险的存在。a dangerous existence

  好了,言归正传。图的存储方式,我们使用的是邻接矩阵matrix,顶点的编号一般从1开始,但是数组却从0开始。所以,如果编号为i的顶点和编号为j的顶点如果存在一条无向边,那么我们记为:matrix[i-1][j-1]

  以上把定义都说明白了,下面,看代码。

1         const int vertexCount = 8; 2         byte[,] matrix = new byte[8, 8]; 3         bool start = true; 4         bool[] visit; 5  6         // 第一次进行时,初始化visit,表示所有顶点都没有遍历 7         void DFS_Init() 8         { 9             visit = new bool[vertexCount];10             for (int i = 0; i < vertexCount; i++)11             {12                 visit[i] = false;13             }14         }15 16         // 递归17         void DFS_Recursive(int v)18         {19             Console.WriteLine(v); // 访问该顶点20             visit[v-1] = true;21             for (int i = 0; i < vertexCount; i++)22             {23                 if (!visit[i] && matrix[v-1, i] == (byte)1)  // 如果该顶点没有被访问过,并且与顶点v存在边Ev,i24                 {25                     DFS_Recursive(i+1);  //数组下标为i,顶点编号为i+126                 }27             }28             29         }30 31         // 非递归32         void DFS(int v)33         {34             Console.WriteLine(v);35             visit[v] = true;36             Stack
stack = new Stack
();37 stack.Push(v);38 while (stack.Count > 0)39 {40 v = stack.Peek();41 int i;42 for (i = 0; i < vertexCount; i++)43 {44 if (!visit[i] && matrix[v - 1, i] == (byte)1) // 如果该顶点没有被访问过,并且与顶点v存在边Ev,i45 {46 Console.WriteLine(i+1);47 visit[i] = true;48 stack.Push(i+1);49 break;50 }51 52 }53 if (i == vertexCount)54 {55 stack.Pop(); //如果通过该顶点不能再访问其他顶点时,出栈56 }57 }58 }

 广度优先搜索

1         void BFS(int v) 2         { 3             Console.WriteLine(v); 4             visit[v - 1] = true; 5             Queue
queue = new Queue
(); 6 queue.Enqueue(v); 7 while (queue.Count > 0) 8 { 9 v = queue.Dequeue();10 for (int i = 0; i < vertexCount; i++)11 {12 if (!visit[i] && matrix[v - 1, i] == (byte)1)13 {14 Console.WriteLine(i + 1);15 visit[i] = true;16 queue.Enqueue(i + 1);17 }18 }19 }20 }

 

转载于:https://www.cnblogs.com/kylinxue/p/4798178.html

你可能感兴趣的文章
Java调用clojure
查看>>
RocketMQ安装、启动
查看>>
POJ_2653_Pick-up sticks_線線相交
查看>>
spring+mybati java config配置引起的bean相互引用日志报警告问题
查看>>
IntelliJ IDEA Web开发之 SpringMvc + Mybatis 之 配置文件
查看>>
常见网络编程面试题答案征集与面试题(收集)
查看>>
文档显示部件,文档编辑部件获取标签的值
查看>>
VMware host-only模式上网设置
查看>>
使用活动目录组策略添加客户端端远程开机自动运行程序
查看>>
tomcat指定虚拟目录
查看>>
TODO:即将开发的第一个小程序
查看>>
我的友情链接
查看>>
Thanks for the memory, Linux
查看>>
制作WinPE3.0 32位与64位的双启动BCD文件
查看>>
Java8新特性之:流(二)
查看>>
JAVA学习笔记(初级)--面向对象基础
查看>>
Mybatis开发步骤
查看>>
Making your C++ code robust<three>
查看>>
jfreechart Line多个曲线图,曲线点图
查看>>
Ubuntu 16.04 设置固定IP地址
查看>>