图的深度优先搜索和广度优先搜索
2015-09-10 15:59
417 查看
图论中最粗暴的遍历方式非DFS和BFS莫属了。但是正是这种粗暴的方式,在笔试中被考察的概率非常的大。并且作为压轴题目,成为了一种危险的存在。a dangerous existence
好了,言归正传。图的存储方式,我们使用的是邻接矩阵matrix,顶点的编号一般从1开始,但是数组却从0开始。所以,如果编号为i的顶点和编号为j的顶点如果存在一条无向边,那么我们记为:matrix[i-1][j-1]
以上把定义都说明白了,下面,看代码。
广度优先搜索
好了,言归正传。图的存储方式,我们使用的是邻接矩阵matrix,顶点的编号一般从1开始,但是数组却从0开始。所以,如果编号为i的顶点和编号为j的顶点如果存在一条无向边,那么我们记为:matrix[i-1][j-1]
以上把定义都说明白了,下面,看代码。
const int vertexCount = 8; byte[,] matrix = new byte[8, 8]; bool start = true; bool[] visit; // 第一次进行时,初始化visit,表示所有顶点都没有遍历 void DFS_Init() { visit = new bool[vertexCount]; for (int i = 0; i < vertexCount; i++) { visit[i] = false; } } // 递归 void DFS_Recursive(int v) { Console.WriteLine(v); // 访问该顶点 visit[v-1] = true; for (int i = 0; i < vertexCount; i++) { if (!visit[i] && matrix[v-1, i] == (byte)1) // 如果该顶点没有被访问过,并且与顶点v存在边Ev,i { DFS_Recursive(i+1); //数组下标为i,顶点编号为i+1 } } } // 非递归 void DFS(int v) { Console.WriteLine(v); visit[v] = true; Stack<int> stack = new Stack<int>(); stack.Push(v); while (stack.Count > 0) { v = stack.Peek(); int i; for (i = 0; i < vertexCount; i++) { if (!visit[i] && matrix[v - 1, i] == (byte)1) // 如果该顶点没有被访问过,并且与顶点v存在边Ev,i { Console.WriteLine(i+1); visit[i] = true; stack.Push(i+1); break; } } if (i == vertexCount) { stack.Pop(); //如果通过该顶点不能再访问其他顶点时,出栈 } } }
广度优先搜索
void BFS(int v) { Console.WriteLine(v); visit[v - 1] = true; Queue<int> queue = new Queue<int>(); queue.Enqueue(v); while (queue.Count > 0) { v = queue.Dequeue(); for (int i = 0; i < vertexCount; i++) { if (!visit[i] && matrix[v - 1, i] == (byte)1) { Console.WriteLine(i + 1); visit[i] = true; queue.Enqueue(i + 1); } } } }
相关文章推荐
- R连接 oralce数据库
- sql server 行转化成列数据 小结
- iOS UIWebView 加载本地h5总结
- <a4j:keeyAlive>的英文介绍
- Windows_dll的含义和Dependency Walker使用说明( 查找函数定义 )
- maven与springMVC之接收form表单防止乱码
- HDU 4268 Alice and Bob(lower_bound)
- 0909编译原理
- HDU 4268 Alice and Bob(lower_bound)
- Rails, ActiveRecord::Base.include_root_in_json
- boost 1.47.0 linux/windows 编译库:regex与iostreams
- wget命令详解
- Win7下Eclipse中文字体太小
- java 笔记
- myeclipse中配置tomcat启动参数
- android Loaders介绍
- Python的二进制位运算
- ffmpeg]ffmpeg使用参数的中文说明
- 利用JavaScript打印出Fibonacci数(不使用全局变量打印斐波那契数)
- android常用工具类