Java广度优先搜索与深度优先搜索

原创 2017年02月16日 15:56:58

有两种常用的方法可用来搜索图:即深度优先搜索和广度优先搜索。它们最终都会到达所有连通的顶点。深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现。  

1.广度优先搜索:

import java.util.Arrays;
import java.util.Scanner;


/***
 * 深度优先遍历:顾名思义,就是一条路走到黑,走到最深的地方。当无路可走时,就返回上一步向其他路走,若没有其他路,则在返回一层
 * 参考链接:http://developer.51cto.com/art/201406/443115.htm 
 * http://blog.csdn.net/rookie_algo/article/details/7391847
 * http://www.cnblogs.com/yongheng20/p/5749957.html
 * */
public class BroadSearch {
/**
     * @param args
     */
    final static int MAXN = 100;
    static Scanner scan = new Scanner(System.in);
    public static class Queue    {
        public int Depth;
        public int Dot;
        Queue()    {
            Depth = -1;
            Dot = -1;
        }
        public void enterQueue(int dot,int dep)    {
            Dot = dot;
            Depth = dep;
            System.out.println(Dot+" "+"The Depth is:"+ Depth);
        }
        public int depDate()    {
            return Depth;
        }
        public int dotdate()    {
            return Dot;
        }
    };
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[][] Graph = new int[MAXN][MAXN];
        boolean[] vis = new boolean[MAXN];
        for(int i=0;i<MAXN;i++)    {
            Arrays.fill(Graph[i], 0);
        }
        Arrays.fill(vis, false);
        int base = 0;int top = 0;
        Queue[] queue = new Queue[MAXN];
        int n,m;//n为点数,m为边数
        n = scan.nextInt();
        m = scan.nextInt();
        for(int i=0;i<2*n;i++)    {
            queue[i]=new Queue();
        }
        for(int i=0;i<m;i++)    {
            int a,b;
            a = scan.nextInt();
            b = scan.nextInt();
            Graph[a][b] = Graph[b][a] = 1;
        }
        for(int i=0;i<n;i++)    {
            if(vis[i] == false)    {
                int dot = 0;int dep=0;
                queue[top].enterQueue(i, 1);
                top++;
                vis[i] = true;
                while(top != base)    {
                    dep=queue[base].depDate()+1;
                    dot=queue[base].dotdate();
                    for(int j=0;j<n;j++)    {
                        if(Graph[dot][j] == 1 && vis[j] == false)    {
                            queue[top].enterQueue(j, dep);
                            top++;
                            vis[j] = true;
                        }
                    }
                    base++;
                }
            }
        }
    }
}


2.深度优先搜索:

import java.util.Arrays;
import java.util.Scanner;


/***
 * 深度优先遍历:顾名思义,就是一条路走到黑,走到最深的地方。当无路可走时,就返回上一步向其他路走,若没有其他路,则在返回一层
 * 参考链接:http://developer.51cto.com/art/201406/443115.htm 
 * http://blog.csdn.net/rookie_algo/article/details/7391847
 * http://www.cnblogs.com/yongheng20/p/5749957.html
 * */
public class DepthSearch {
/**
     * @param args
     */
    final static int MAXN = 100;
    static Scanner scan = new Scanner(System.in);
    public static class Stack    {
        int Depth;
        int Dot;
        Stack()    {
            Depth = -1;
            Dot = -1;
        }
        public int getTopDot()    {
            return Dot;
        }
        public int getDepth()    {
            return Depth;
        }
        public void PushDate(int dep,int dot)    {
            Depth = dep;
            Dot = dot;
            System.out.println(dot+" The depth is:"+dep);
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[][] Graph = new int[MAXN][MAXN];
        boolean[] vis = new boolean[MAXN];
        for(int i=0;i<MAXN;i++)    {
            Arrays.fill(Graph[i], 0);
        }
        Arrays.fill(vis, false);
        int base = 0;int top = 0;
        Stack[] stack = new Stack[MAXN];
        int n,m;//n为点数,m为边数
        n = scan.nextInt();
        m = scan.nextInt();
        for(int i=0;i<2*n;i++)    {
            stack[i]=new Stack();
        }
        for(int i=0;i<m;i++)    {
            int a,b;
            a = scan.nextInt();
            b = scan.nextInt();
            Graph[a][b] = Graph[b][a] = 1;
        }
        for(int i=0;i<n;i++)    {
            if(vis[i] == false)    {
                int dep = -1;
                int dot = -1;
                stack[top].PushDate(1, i);
                top++;
                vis[i] = true;
                while(base != top)    {
                    dot = stack[top-1].getTopDot();
                    for(int j=0;j<n;j++)    {
                        if(Graph[dot][j] == 1 && vis[j] == false)    {
                            dep = stack[top-1].getDepth()+1;
                            stack[top].PushDate(dep, j);
                            top++;
                            vis[j] = true;
                            break;
                        }
                        if(j == n-1)//如果无路可走,出栈
                            top--;
                    }
                    
                }
            }
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

基于图的深度优先搜索和广度优先搜索java实现

为了解15puzzle问题,了解了一下深度优先搜索和广度优先搜索。先来讨论一下深度优先搜索(DFS),深度优先的目的就是优先搜索距离起始顶点最远的那些路径,而广度优先搜索则是先搜索距离起始顶点最近的那...
  • u011638883
  • u011638883
  • 2013年12月06日 16:49
  • 7263

深度优先搜索和广度优先搜索的比较与分析

深度优先搜索和广度优先搜索的比较与分析 一、深度优先搜索和广度优先搜索的深入讨论   (一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结...
  • qq328691560
  • qq328691560
  • 2015年08月13日 15:46
  • 3477

图基本算法 图搜索基于邻接表的(广度优先、深度优先)

BFS    注:以下代码均为部分,关于图的表示方法参看我的博客—图的存储:   一、广度优先搜索   广度优先搜索(BFS)是最简单的图搜索算法之一,也是很多重要的图算法...
  • tham_
  • tham_
  • 2015年05月27日 16:07
  • 2138

二叉树的深度优先搜索与广度优先搜索实现

  • 2015年04月24日 14:24
  • 13KB
  • 下载

TDPL邻接表图的深度优先搜索和广度优先搜索.doc

  • 2015年05月12日 21:38
  • 57KB
  • 下载

邻接表表示的图的深度优先搜索和广度优先搜索程序

  • 2013年06月03日 11:44
  • 20KB
  • 下载

邻接表表示的图的深度优先搜索和广度优先搜索程序

  • 2009年06月28日 15:28
  • 5KB
  • 下载

基于深度优先搜索和广度优先搜索的最短路径问题

  • 2013年12月25日 18:26
  • 17KB
  • 下载

图的深度优先搜索,广度优先搜索,最小生成树算法,包括kruskal、prim算法的C++实现代码

  • 2016年04月27日 21:04
  • 1.09MB
  • 下载

图的深度优先搜索,广度优先搜索

  • 2011年03月26日 16:07
  • 2.2MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java广度优先搜索与深度优先搜索
举报原因:
原因补充:

(最多只允许输入30个字)