邻接表存储图,DFS遍历图的java代码实现




import java.util.*;

public class Main{
    static int MAX_VERTEXNUM = 100;
    static int [] visited = new int[MAX_VERTEXNUM];
    public static void main(String [] args){
        Graph G = new Graph();
        creatGraph(G);
        output(G);
        for(int i=0;i<G.vertex_num;i++)
            visited[i]=0;
        System.out.println("DFS遍历的结果是:");
        dfs(G,0);//从G.node_list[0]开始DFS遍历
    }
    static void creatGraph(Graph G){
        Scanner in = new Scanner(System.in);
        System.out.println("请输入顶点数v和边数e,(v e):");
        G.vertex_num = in.nextInt();
        G.edge_num= in.nextInt();
        System.out.println("请输入各顶点信息:");
        for(int i=0;i<G.vertex_num;i++){
            G.node_list[i] = new VertexNode();
            G.node_list[i].date = in.next();
            G.node_list[i].first_edge = null;  //很重要
        }
        System.out.println("请输入各边信息(以空格隔开):");
        for(int i=0;i<G.edge_num;i++){
            EdgeNode p = new EdgeNode();
            String str1 = in.next();
            String str2 = in.next();
            int v1 = locateVex(G,str1);
            int v2 = locateVex(G,str2);
            p.vertex = v1;
            p.next = G.node_list[v2].first_edge;
            G.node_list[v2].first_edge = p;
            EdgeNode q = new EdgeNode();//如果是有向图,则不存在下面的代码(上面的代码的存储顺序可能有变化)
            q.vertex = v2;
            q.next = G.node_list[v1].first_edge;
            G.node_list[v1].first_edge = q;
        }
    }
    static int locateVex(Graph G,String s){
        for(int i=0;i<G.vertex_num;i++){
            if(G.node_list[i].date.equals(s))
                return i;
        }
        return -1;
    }
    static void output(Graph G){
        System.out.println("输出邻接表存储情况:");
        EdgeNode p = new EdgeNode();
        for(int i=0;i<G.vertex_num;i++){
            System.out.print(G.node_list[i].date);
            p = G.node_list[i].first_edge;
            while(p!=null){
                System.out.print("->"+G.node_list[p.vertex].date);
                p = p.next;
            }
            System.out.println();
        }
    }
    static void dfs(Graph G,int k){
        System.out.println(G.node_list[k].date);
        visited[k]=1;
        EdgeNode p = new EdgeNode();
        p = G.node_list[k].first_edge;
        while(p!=null){
            if(visited[p.vertex]!=1)
                dfs(G,p.vertex);
            p = p.next;
        }
    }
}
//顶点存储
class VertexNode{
    String date;
    EdgeNode first_edge = new EdgeNode();

}
//边存储
class EdgeNode{
    int vertex;
    EdgeNode next;
}
//图存储
class Graph{
    VertexNode [] node_list = new VertexNode[100];
    int vertex_num,edge_num;
}

//输出结果:注意:(邻接表的保存顺序与输入边的顺序有关)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Graph()是一种非常重要的数据结构,它可以用来表示许多实际问题,比如社交网络、路线规划等。在这里,我将为你介绍(Graph)的入门概念、存储结构、遍历方式以及Java代码实现。 1. 入门概念 Graph()由节点(vertex)和边(edge)组成,节点表示中的一个实体,边表示节点之间的关系。可以分为有向和无向,有向中每条边有一个方向,而无向中每条边没有方向。中的路径(path)是一系列节点,这些节点通过边相互连接。 2. 存储结构 存储结构一般有两种方式:邻接矩阵和邻接表。 邻接矩阵:将中的节点用一个数组来表示,用一个二维数组来表示边的关系,当两个节点之间有边时,对应的二维数组中的元素为1,否则为0。 邻接表:将中的节点用一个链表来表示,每个节点的链表中存储与其相连的节点。 3. 遍历方式 对于遍历,一般有两种方式:深度优先遍历(DFS)和广度优先遍历(BFS)。 深度优先遍历:从一个节点开始,一直沿着当前路径遍历到底,直到不能再遍历为止,然后回退到上一个节点,继续遍历其他路径。这种遍历方式一般用递归实现。 广度优先遍历:从一个节点开始,依次遍历与其相邻的节点,再遍历与这些节点相邻的节点,依次类推。这种遍历方式一般用队列实现。 4. Java代码实现 以下是Java代码实现(Graph)的基本操作: ```java import java.util.*; public class Graph { int[][] adjacencyMatrix; // 邻接矩阵存储 LinkedList<Integer>[] adjacencyList; // 邻接表存储 int numVertices; // 节点个数 public Graph(int numVertices) { this.numVertices = numVertices; adjacencyMatrix = new int[numVertices][numVertices]; adjacencyList = new LinkedList[numVertices]; for (int i = 0; i < numVertices; ++i) { adjacencyList[i] = new LinkedList<Integer>(); } } // 添加边 public void addEdge(int i, int j) { adjacencyMatrix[i][j] = 1; adjacencyList[i].add(j); } // 深度优先遍历 public void DFS(int startVertex) { boolean[] visited = new boolean[numVertices]; DFSUtil(startVertex, visited); } private void DFSUtil(int vertex, boolean[] visited) { visited[vertex] = true; System.out.print(vertex + " "); Iterator<Integer> i = adjacencyList[vertex].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) DFSUtil(n, visited); } } // 广度优先遍历 public void BFS(int startVertex) { boolean[] visited = new boolean[numVertices]; LinkedList<Integer> queue = new LinkedList<Integer>(); visited[startVertex] = true; queue.add(startVertex); while (queue.size() != 0) { startVertex = queue.poll(); System.out.print(startVertex + " "); Iterator<Integer> i = adjacencyList[startVertex].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) { visited[n] = true; queue.add(n); } } } } } ``` 以上就是(Graph)的入门概念、存储结构、遍历方式以及Java代码实现。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值