Java 图的建立及DFS深度优先遍历

本文介绍了一种使用深度优先搜索(DFS)算法遍历图的方法,并提供了详细的Java实现代码。通过栈结构辅助DFS过程,文章展示了如何添加顶点、边及执行DFS遍历。

图作为一种重要的数据结构,在实际中是非常有用的。

package num;
import java.util.*;
import java.io.*;

class StackX
{
    private final int SIZE =20;
    private int[] st;
    private int top;
    public StackX()
    {
        st = new int[SIZE];
        top = -1;
    }
    public void push(int j)
    {
        st[++top] = j;
    }
    public int pop()
    {
        return st[top--];
    }
    public int peek()
    {
        return st[top];
    }
    public boolean isEmpty()
    {
        return (top == -1);
    }
}

class Vertex
{
    public char label;
    public boolean wasVisited;
    public Vertex(char lab)
    {
        this.label = lab;
        wasVisited = false;      //初始的时候,表示这个图的这个点未被访问过
    }
}

class G               //表示图
{
    private final int MAX_VERTS = 20;
    private Vertex[] vertexList;    
    private int adjMat[][];         //邻接矩阵
    private int nVerts;
    private StackX theStack;        //栈类型
    public G()
    {
        vertexList = new Vertex[MAX_VERTS];
        adjMat = new int[MAX_VERTS][MAX_VERTS];
        nVerts = 0;
        for(int i = 0; i < MAX_VERTS; i++)
        {
            for(int j = 0; j < MAX_VERTS; j++)
                adjMat[i][j] = 0;
        }
        theStack = new StackX();
    }
    public void addVertex(char lab)
    {
        vertexList[nVerts++] = new Vertex(lab);
    }
    public void addEdge(int start,int end)
    {
        adjMat[start][end] = 1;
        adjMat[end][start] = 1;
    }
    public void displayVertex(int v)
    {
        System.out.print(vertexList[v].label);
    }
    public int getAdjUnvisitedVertex(int v)                                 //这个方法是用来将图中的某一个点是否有与其他节点关联的边以及这个节点本身是否被访问过了
    {
        for(int i = 0; i < nVerts; i++)
            if(adjMat[v][i] == 1 && vertexList[i].wasVisited == false)
            {
                return i;
            }
        return -1;
    }
    public void dfs()              //注意,DFS采用栈来存储图中的节点
    {
        vertexList[0].wasVisited = true;   
        displayVertex(0);
        theStack.push(0);
        while(! theStack.isEmpty())
        {
            int v = getAdjUnvisitedVertex(theStack.peek());       
            if(v == -1)
                theStack.pop();
            else
            {
                vertexList[v].wasVisited = true;
                displayVertex(v);
                theStack.push(v);
            }
        }
        for(int i = 0; i < nVerts; i++)
        {
            vertexList[i].wasVisited = false;
        }
    }
}

public class Graph
{
    public static void main(String args[])
    {
        G graph = new G();
        graph.addVertex('A');
        graph.addVertex('B');
        graph.addVertex('C');
        graph.addVertex('D');
        graph.addVertex('E');
        graph.addEdge(0, 1);
        graph.addEdge(1, 2);
        graph.addEdge(0, 3);
        graph.addEdge(3, 4);
        System.out.print("Visits: ");
        graph.dfs();
        System.out.println();
    }
}

 以上是采用DFS,也就是深度优先遍历算法来执行的对图中所有节点进行的扫描。

深度优先搜索(DFS)是一种常用的遍历算法,它可以用来遍历或搜索中的节点。在DFS中,从一个起始节点开始,沿着一条路径尽可能深入地访问节点,直到无法继续深入为止,然后回溯到上一个节点,继续访问其他未被访问的节点,直到所有节点都被访问为止。 在Java中,可以使用递归或者栈来实现DFS算法。下面是一个使用递归实现DFS的示例代码: ```java import java.util.*; class Graph { private int V; // 中节点的数量 private LinkedList<Integer> adj[]; // 邻接表表示 // 构造函数 Graph(int v) { V = v; adj = new LinkedList[v]; for (int i = 0; i < v; ++i) adj[i] = new LinkedList(); } // 添加边 void addEdge(int v, int w) { adj[v].add(w); } // 递归实现DFS void DFSUtil(int v, boolean visited[]) { visited[v] = true; System.out.print(v + " "); Iterator<Integer> i = adj[v].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) DFSUtil(n, visited); } } // 对外公开的DFS接口 void DFS(int v) { boolean visited[] = new boolean[V]; DFSUtil(v, visited); } } public class Main { public static void main(String args[]) { Graph g = new Graph(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); g.addEdge(3, 3); System.out.println("节点2开始的DFS遍历结果:"); g.DFS(2); } } ``` 上述代码中,我们首先定义了一个`Graph`类来表示,其中使用邻接表来存储的结构。然后,我们实现了`DFSUtil`方法来递归地进行DFS遍历,并在遍历过中打印节点的值。最后,在`main`方法中创一个对象,并调用`DFS`方法来进行DFS遍历。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值