广度优先搜索、深度优先搜索

package com.tyson.graph;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class GraphMatrix {
    private ArrayList<Integer> vertexList;
    private int[][] edges;
    private int edgesNum;

    public GraphMatrix(int n) {
        edges = new int[n][n];
        edgesNum = 0;
        vertexList = new ArrayList<Integer>(n);
    }

    public void insertVertex(int vertex) {
        vertexList.add(vertex);
    }

    public void insertVertex(int[] vertexes) {
        for(int i=0;i<vertexes.length;i++) {
            vertexList.add(vertexes[i]);
        }
    }

    public void insertEdge(int i, int j, int weight) {
        if(i<0||j<0||i>=vertexList.size()||j>=vertexList.size()) {
            return;
        }

        edges[i][j] = weight;
        edgesNum++;
    }

    public int getVertexNum() {
        return vertexList.size();
    }

    //得到第一个邻接节点的下标
    public int getFirstNeighbor(int index) {
        for(int i=0;i<vertexList.size();i++) {
            if(edges[index][i]>0) {
                return i;
            }
        }
        return -1;
    }

    //得到第k个邻接节点的下一个节点的下标
    public int getNextNeighbor(int index, int k) {
        for(int i=k+1;i<vertexList.size();i++) {
            if(edges[index][i]>0)
                return i;
        }
        return -1;
    }

    private void DFS(boolean[] isVisited, int i) {
        if(isVisited[i] == false) {
            System.out.print(vertexList.get(i) + "-->");
            //标记为已访问
            isVisited[i] = true;
            int index = getFirstNeighbor(i);
            while(index != -1) {
                if(isVisited[index] == false) {
                    DFS(isVisited, index);
                }
                index = getNextNeighbor(i, index);
            }
        }
        System.out.println();
    }

    public void DFS() {
        boolean[] isVisited = new boolean[vertexList.size()];

        for(int j=0;j<vertexList.size();j++) {
            isVisited[j] = false;
        }
        for(int i=0;i<vertexList.size();i++) {
            if(isVisited[i] == false)
                DFS(isVisited, i);
        }
    }

    public void BFS() {
        boolean isVisited[] = new boolean[vertexList.size()];
        for(int i=0;i<vertexList.size();i++) {
            isVisited[i] = false;
        }

        for(int j=0;j<vertexList.size();j++) {
            BFS(isVisited, j);
        }
    }

    private void BFS(boolean[] isVisited, int index) {
        if(isVisited[index] == true)
            return;
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.offer(index);

        while(!queue.isEmpty()) {
            index = queue.poll();
            if(isVisited[index] == false) {
                System.out.print(vertexList.get(index) + "-->");
                isVisited[index] = true;

                int neighbor = getFirstNeighbor(index);

                while(neighbor != -1) {
                    queue.offer(neighbor);
                    neighbor = getNextNeighbor(index, neighbor);
                    System.out.print(" put ");
                }
                System.out.println();
            }
        }
    }

    public static void main(String args[]){
        GraphMatrix g = new GraphMatrix(5);

        int[] vertexes = {1, 2, 3, 4, 5};

        g.insertVertex(vertexes);

        g.insertEdge(0, 1, 1);
        g.insertEdge(0, 2, 1);
        g.insertEdge(0, 3, 1);
        g.insertEdge(1, 3, 1);
        g.insertEdge(2, 3, 1);

        g.BFS();
    }
}

原文地址:https://www.cnblogs.com/tyson03/p/8995656.html

时间: 2024-08-29 23:24:15

广度优先搜索、深度优先搜索的相关文章

POJ 2196 Computer(搜索-深度优先搜索)

Computer Problem Description A school bought the first computer some time ago(so this computer's id is 1). During the recent years the school bought N-1 new computers. Each new computer was connected to one of settled earlier. Managers of school are

挑战程序2.1.4 穷竭搜索&gt;&gt;深度优先搜索

{'W','.','.','W','.'}, {'W','.','.','.','.'}, {'.','.','.','W','.'}, {'W','.','.','.','.'}, {'W','.','W','W','W'}例子,此处有5处积水 题目:有N*M格子的花园,W表示积水,'.'表示干地,积水附近8个区域只要有积水,那么这两处连通,并算作是同一处积水,问一共有几处积水? 思路:穷竭搜索,O(N*M),搜索到积水则变成'.',并搜索连通的积水将其变成'.',直到这块积水搜索结束,此时a

搜索——深度优先搜索(DFS)

设想我们现在身处一个巨大的迷宫中,我们只能自己想办法走出去,下面是一种看上去很盲目但实际上会很有效的方法. 以当前所在位置为起点,沿着一条路向前走,当碰到岔道口时,选择其中一个岔路前进.如果选择的这个岔路前方是一条死路,就退回到这个岔道口,选择另一个岔路前进.如果岔路口存在新的岔道口,那么仍然按上面的方法枚举新岔道口的每一条岔道.这样,只要迷宫存在出口,那么这个方法一定能够找到它. 也就是说,当碰到岔道口时,总是以"深度"作为前进的关键词,不碰到死胡同就不回头,因此这种搜索的方式称为深

图的邻接表表示、广度优先、深度优先搜索

图,就是我们在数据结构中学到的图,它是一种存储信息的结构.图是一类在实际应用中非常常见的数据结构,当数据规模大到一定程度时,如何对其进行高效计算即成为迫切需要解决的问题.最常见的大规模图数据的例子就是互联网网页数据,网页之间通过链接指向形成规模超过500 亿节点的巨型网页图.再如,Facebook 社交网络也是规模巨大的图,仅好友关系已经形成超过10 亿节点.千亿边的巨型图,考虑到Facebook 正在将所有的实体数据节点都构建成网状结构,其最终形成的巨型网络数据规模可以想见其规模.要处理如此规

挑战程序2.1.4 穷竭搜索&gt;&gt;深度优先搜索 练习题 POJ1979黑与红

http://poj.org/problem?id=1979 Description There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move

算法-无向图(深度优先搜索和广度优先搜索)

图中最常用到的两种搜索深度优先搜索和广度优先搜索,深度优先搜索是一种在开发爬虫早期使用较多的方法它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链接的Html文件) ,广度搜索属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止. 深度优先搜索 图中我们经常会遇到一个问题就是图的连通性,比如说从一个顶点到另外一个顶点,判断顶点和其他顶点之间的连通性,以下图为例: 搜索API定义: @interface

【图论】广度优先搜索和深度优先搜索

写在最前面的 这篇文章并没有非常详细的算法证明过程.导论里面有非常详细的证明过程.本文只阐述“广度优先和深度优先搜索的思路以及一些简单应用”. 两种图的遍历算法在其他图的算法当中都有应用,并且是基本的图论算法. 广度优先搜索 广度优先搜索(BFS),可以被形象的描述为“浅尝辄止”,具体一点就是每个顶点只访问它的邻接节点(如果它的邻接节点没有被访问)并且记录这个邻接节点,当访问完它的邻接节点之后就结束这个顶点的访问. 广度优先用到了“先进先出”队列,通过这个队列来存储第一次发现的节点,以便下一次的

人员分配问题(简单的深度优先搜索题目)

问题描述 某单位有若干人员,现执行某任务需要一定人数人员.编写程序,输入单位人数和每位员工名字,再输入执行任务所需人数,输出所有可能派出人员方案 程序代码 #include<bits/stdc++.h> using namespace std; char s[10][20]; //存放读进来的人的名字,暂定人最多为10个 char ans[10][20]; //存放每一次生成的结果 int maxMan = 0; //存放执行任务所需人数 int times = 0; //存放总方案数 int

深度优先搜索与广度优先搜索算法理解

深度优先搜索算法和广度优先搜索算法是图论中两个有意思也很实用的算法,下面我们来看看这两个算法. 严书中,给出的利用深度优先搜索(Deep First Search)算法进行图的遍历伪码如下 1 Boolean visited[MAX]; //标志数组 2 Status (*VisitFunction)(int v); //访问函数 3 4 void DFSTraverse(Graph G, Status (*Visit)(int v)) 5 { 6 VisitFunction = Visit;

图论 深度优先搜索 广度优先搜索的非递归实现

深度优先遍历 1.深度优先遍历的递归定义 假设给定图G的初态是所有顶点均未曾访问过.在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过:然后依次从v出发搜索v的每个邻接点w.若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止.若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止. 图的深度优先遍历类似于树的