终于啃下来DFS和BFS这两块骨头了
接下来整理自己下
DFS:
原理;先找到根节点,搜寻他的根节点。将找到的节点当作当前节点再去寻找与它相连下一个节点,一直到没有节点为止,
此时返回上一级继续寻找上一级的别的节点,直到没有节点可以搜索便结束了。这个算法使用递归来实现,而递归实际就是通过栈来实现的。
这是邻接矩阵实现的
class DFSDeep{
public void DFSMethod(Graph1 graph){
int i;
for(i=0;i<5;i++)
graph.visited[i]=false;//初始化所有定点的visit值
for(i=0;i<5;i++){//递归遍历所有没被访问的节点
if(!graph.visited[i])
DFSConnect(graph,i);
}
}
public void DFSConnect(Graph1 graph,int i){
int j;
graph.visited[i]=true;//被访问过的节点设置为true
System.out.println(graph.vexs[i]);//输出这个节点
for (j=0;j<5;j++)
{
if(graph.arc[i][j]!=0&&graph.arc[i][j]!=65535&&graph.visited[j]!=true){//选择出来与当前节点有连线且未被访问的节点
DFSConnect(graph,j);//将连接的顶点输出
}
}
}
}
而邻接链表的实现无法遍历他的矩阵,所以用for循环,所以用p=p->next来寻找下一个连接节点
BFS :
原理;先找到根节点,搜选这个节点的下一层,所有节点(也就是和它直接相连的节点),直到每层都搜寻完。
BFS使用队列完成。首先将根节点存入队列,接下来对根节点出队列并对它所有子节点遍历并入队列,入队列这一操作是为了以后能遍历他们的子节点。最后直至无法队列空便结束
class DFSWidth{
public void DFSWidthMethod(Graph2 graph){
int i,j,k,num;//定义num目的是为了在递归变换下标值时不会影响到i的值,如果时连通图无影响
int f=0;
Queue queue=new LinkedBlockingQueue();
for (i=0;i<5;i++)//将所有节点设置为未访问过{
graph.visited[i]=false;
for(i=0;i<5;i++){
System.out.println("123123123213213213");
num=i;
if(!graph.visited[num]){
graph.visited[num]=true;//设为此定点被访问过
System.out.println(graph.vexs[num]);//输出此定点
queue.offer(num);//入队列
/**
* 这个while语句对当前i节点进行判断与他相连的节点全部输出了
* **/
while(queue.size()!=0){
k= (int) queue.poll();//移除元素,要将当前节点的直接相连节点进行遍历时,他出队列
// i=k;//这个i改变会改变循环里的i,所以定义num来改变下标的值
num=k;
/**
* 下面这个for语句对与当前i相连的节点元素进行访问和入队列,
* **/
for(j=0;j<5;j++){
if(graph.arc[num][j]!=0&&graph.visited[j]!=true) { //判断这个点是否被访问过
graph.visited[j]=true;//设置这个点被访问了
System.out.println(graph.vexs[j]); //输出这个点
queue.offer(j);//将这个点入队列
}
}
}
}
}
}
用邻接表也是无法遍历,所以用next来访问。
本文深入探讨了深度优先搜索(DFS)与广度优先搜索(BFS)两种基本图搜索算法。介绍了DFS通过递归方式从根节点开始探索尽可能深的路径,而BFS则按层次顺序探索所有节点。提供了邻接矩阵与邻接链表实现方式,并附带代码示例。

2222

被折叠的 条评论
为什么被折叠?



