DFS BFS 示例 以及BFS部分算法代码

上一篇写了DFS的邻接矩阵和邻接表的,这篇再写一下BFS的

先大概讲一下BFS , 全名广度优先搜索,没有回溯和探查,逐层遍历,采用队列实现

先访问当前顶点v, 然后访问v的各个未被访问过的邻接顶点,然后在一次访问v的各个邻接顶点的未被访问的邻接顶点

代码实现如下 :

void BFS (Graph &G , int v ) {
	int i , w , n = G.Number(); //取出顶点个数
	bool * visit = new bool [n] ;
	for( i =0 ;i< n ; i++) {
		visit[i] =false ;

	int loc = G.getVertexPos(v) ;
	cout << G.getValue(loc) <<endl ;
	visit[loc] = true ;//第一个顶点访问过了
	Queue Q ;
	Q.EnQueue(loc) ;//进队列
	while (! Q.IsEmpty()) {
		Q.DeQueue(loc) ;
		w = G.getFirstNeig(loc) ;
		while (w != -1) {
			if(visit[w] ==false) {
				cout << G.getValue(w) <<"" ;
				visit[w] = true ;
				Q.EnQueue (w) ;

}
				w = G.getNextNeig(loc , w ) ;

}
}
			delete []visit ;
}
}

代码是在文本上写得,可能不是很规范,大概跟书上是一样的,书名是:数据结构(用面向对象方法与C++语言描述)

时间: 2024-08-26 09:17:28

DFS BFS 示例 以及BFS部分算法代码的相关文章

UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)

UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常量数组或者写8条DFS调用. 下述算法是:种子填充(floodfill) 两种连通区域 四连通区域:从区域内一点出发,可通过上.下.左.右四个方向的移动组合,在不越出区域的前提下,能到达区域内的任意像素 八连通区域:从区域内每一像素出发,可通过八个方向,即上.下.左.右.左上.右上.左下.右下移动的

BFS、双向BFS和A*

BFS.双向BFS和A* Table of Contents 1. BFS 2. 双向BFS 3. A*算法 光说不练是无用的.我们从广为人知的POJ 2243这道题谈起:题目大意:给定一个起点和一个终点.按骑士的走法(走日字),从起点到终点的最少移动多少次 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2RraXJjaGhvZmY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/g

C语言快速排序算法代码分析

最近在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,很来发现设计模式真的很重要.有的时候代码的可维护.可重用.可扩展确实胜过单纯的算法效率高.所以拾起大牛书籍<大话设计模式>同时参考网上诸大牛的博客,开始我的设计模式之旅.由于平时编程时用C/C++,现在是Java,也练练Java语法. 今天先介绍一下命令模式. 概念: 命令模式(Command):将一个请求封装成一个对象,从而使你可用不同的请求对象对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作.

HDU 1242 -Rescue (双向BFS)&amp;&amp;( BFS+优先队列)

题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 开始以为是水题,想敲一下练手的,后来发现并不是一个简单的搜索题,BFS做肯定出事...后来发现题目里面也有坑 题意是从r到a的最短距离,"."相当时间单位1,"x"相当时间单位2,求最短时间 HDU 搜索课件上说,这题和HDU1010相似,刚开始并没有觉得像剪枝,就改用  双向BFS   0ms  一Y,爽! 网上查了一下,神牛们竟然用BFS+

KMP算法代码实现

//普通的暴力求解法 int ViolentMatch(char* s, char* p)   {       int sLen = strlen(s);       int pLen = strlen(p);          int i = 0;       int j = 0;       while (i < sLen && j < pLen)       {           if (s[i] == p[j])           {               /

常用MD5算法代码

常用的MD5算法代码日期: 2014年8月4日作者: 铁锚 MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请参考 维基百科:MD5 MD5加密后是一个字节数组, 但我们一般是取其十六进制的字符串表示法,当然,十六进制数字符串是区分大小写,在 mysql数据库,Java,和JavaScript语言中,一般是使用小写的字符串来表示, 而在 Oracle数据库官方提供的包中,返回的是大写字符串,这算是一个坑,如果你想要执行多次 md5,可能需要转换为小

C++排序算法代码

C++的快排算法代码  #include<iostream> #include<algorithm> #include<iomanip> #include<time.h> #define N 5000 using namespace std; template <class T> void qsort(T *l,T *r) { T *i,*j,*k;   int t;   i=l;j=r-1;k=i+rand()%(r-l);   t=*k;  

java文本相似度计算(Levenshtein Distance算法(中文翻译:编辑距离算法))----代码和详解

算法代码实现: package com.util; public class SimFeatureUtil { private static int min(int one, int two, int three) { int min = one; if (two < min) { min = two; } if (three < min) { min = three; } return min; } public static int ld(String str1, String str2)

编程算法 - 快速排序算法 代码(C)

快速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的快速排序算法, 作为一个编程者, 任何时候都要完整的手写. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdlib.h> int RandomInRange(int min,