邻接矩阵的深度优先遍历(java版)

这是一个有向边带权的图

顶点数组:[v0, v1, v2, v3, v4]

边数组:   v0  v1  v2  v3  v4    v0                  6    v1  9       3      v2  2           5    v3                  1      v4  
package com.datastruct;

import java.util.Scanner;

public class MGraph {
    //定义图结构,使用邻接矩阵存储
    private static class Graph{
        final int MAXVEX = 10;//最大顶点数
        final int INFINITY = 65535; // 用65535来代表无穷

        String vexs[] = new String[MAXVEX]; //顶点表
        int arc[][] = new int[MAXVEX][MAXVEX]; //邻接矩阵
        int numVertexes; //顶点数
        int numEdges;    //边数
    }
        //打印图的基本信息
    public static void printGraph(Graph g){

        System.out.println("所有顶点:");
        for(int i=0;i<g.numVertexes;i++){
            System.out.print(g.vexs[i]+" ");
        }
        System.out.println();
        System.out.println("矩阵表:");
        for(int i=0;i<g.numVertexes;i++){
            for(int j=0;j<g.numVertexes;j++){
                System.out.print(g.arc[i][j]+"\t");
            }
            System.out.println();
        }
    }
       //创建图结构
     public static void createMGraph(Graph g){

        int i,j,k,w;
        Scanner scanner = new Scanner(System.in);

        System.out.println("输入顶点数和边数:");
        g.numVertexes = scanner.nextInt();
        g.numEdges = scanner.nextInt();

        System.out.println("输入顶点信息:");
        for(i=0;i<g.numVertexes;i++){
            g.vexs[i] = scanner.next();
        }

        //初始化邻接矩阵,让所有的数都是无穷
        for(i=0;i<g.numVertexes;i++){
            for(j=0;j<g.numVertexes;j++){
                g.arc[i][j] = g.INFINITY;
            }
        }
             //构造每个顶点之间的关系
        for(k=0;k<g.numEdges;k++){
            System.out.println("输入边(vi,vj)上的下标vi,vj和权");
            i = scanner.nextInt();
            j = scanner.nextInt();
            w = scanner.nextInt();

            g.arc[i][j] = w;
        }

    }

     public static boolean visited[] = new boolean[20];//访问标识,数量大于等于最大顶点数
                                                       //对应String vexs[] = new String[MAXVEX];顶点表
     public static void DFS(Graph g, int i){
         int j;
         visited[i] = true;
         System.out.println("顶点:"+g.vexs[i]); //③
         for(j=0;j<g.numVertexes;j++){ if(g.arc[i][j] < 65535 && !visited[j]){ //④
                 DFS(g,j);
             }
         }
     }/*访问思路:有一个数组visited[]用来标记顶点是否被访问过,visited[]的下标和g.vexs[]一一对应,visited[0]是true标识g.vexs[0]被访问过了程序从顶点v0开始,一直到v4结束 ① i=0发现v0未被访问 ②输出v0  ③然后依次查找v0所在的那一行,发现v4和它有联系 ④输出v4  ③然后依次查找v4所在的那一行,没人和它有关系  ④回退到v0发现v4的位置,此时v0已经走到这一行的末尾再回退到①,进行第二次循环,i=1发现v1未被访问 ②输出v1 ③然后依次查找v1所在的那一行,v0和v2和它有联系,但v0是已访问的,所有找到v2 ④输出v2 ③然后依次查找v2所在的那一行,发现v0和v3,v0是已访问的,所有找到v3  ④输出v3 ③然后依次查找v3所在的那一行,找到v4,v4是已访问的,所有回退一直回退到 ①进行下一次循环,i=2之后的循环发现顶点都是被访问过的,直到循环结束,遍历结束

依次找到v0 v4 v1 v2 v3 */
     public static void DFSTraverse(Graph g){
         int i;

         //初始化访问标识,全部顶点都是未访问
         for(i=0;i<g.numVertexes;i++){
             visited[i] = false;
         }

         for(i=0;i<g.numVertexes;i++){ // ①
             if(!visited[i]){ // ②
                 DFS(g,i);
             }
         }

     }

    public static void main(String[] args) {

        Graph g = new Graph();
        createMGraph(g);//创建图
        printGraph(g);//输入图的顶点和邻接矩阵
        DFSTraverse(g);//深度优先遍历图
    }

}

时间: 2024-08-15 06:39:25

邻接矩阵的深度优先遍历(java版)的相关文章

邻接矩阵的深度优先遍历

摘要:对<大话数据结构>P240——邻接矩阵的深度优先遍历,进行了自己的理解并完善了代码.Qt Creator测试通过. 举个简单的无序图例子,为了节省时间传手稿. 首先用邻接矩阵的存储结构创建该图,再进行深度优先遍历.代码和解释如下: #include <iostream> #include <stdlib.h> using namespace std; typedef struct//图的邻接矩阵存储结构 { char vexs[5]; int arc[5][5];

邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <limits.h> #include "aqueue.h" #define MAX_VALUE INT_MAX #define MAX_NUM 100 typedef char node_type; typedef struct matrix { node_type vertex[M

邻接表c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

graph.c #include <stdio.h> #include <stdlib.h> #include <limits.h> #include "aqueue.h" #define MAX_NUM 100 typedef char node_type; typedef struct arc_node { int pos; int distance; struct arc_node * next; } Arc_node;//保存Node节点的相

邻接表的深度优先遍历

转载请注明出处http://www.cnblogs.com/hslzju 对<大话数据结构>P241——邻接表的深度优先遍历,进行了自己的理解并完善了代码. 邻接矩阵的深度优先遍历见http://www.cnblogs.com/hslzju/p/5399249.html 举个简单的无序图例子,为了节省时间传手稿. 首先用邻接表的存储结构创建该图,再进行深度优先遍历.代码和解释如下(Qt Creator测试通过): 1 #include <iostream> 2 #include &

存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有结点,又有边,对于有权图来说,每条边上还带有权值.常用的图的存储结构主要有以下二种: 邻接矩阵 邻接表 邻接矩阵 我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法. 我们假设A是这个二维数组

C++实现图的邻接矩阵的创建以及其深度优先遍历和广度优先遍历

#include<iostream> using namespace std; typedef char vertextype; typedef int edgetype; #define maxvex 100 #define infinity 1000 #include<queue> int visited[100]; class MGraph{ public: vertextype vexs[maxvex]; edgetype arc[maxvex][maxvex]; int

邻接矩阵 + 深度优先遍历

1 /** 2 知识点:(有向图) 3 强连通图的邻接矩阵存储图: 4 强连通图的深度优先遍历(递归方式实现) 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 #define N 5 9 #define ARC 10 10 int visit[ARC]; 11 typedef struct { 12 char vex[ARC][N];///顶点 13 int arc[ARC][ARC]; 14 int numv,nume;///顶

树的深度优先遍历和广度优先遍历的原理和java实现代码

import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode right; public TreeNode(int value){ this.value=value; } } TreeNode root; public BinaryTree(int[] array){ root=makeBinaryTreeByArray(array,

基于邻接矩阵存储的图的深度优先遍历和广度优先遍历

图的存储结构相比较线性表与树来说就复杂很多,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放.树结构是一对多的关系,所以我们要将数组和链表的特性结合在一起才能更好的存放. 那么我们的图,是多对多的情况,另外图上的任何一个顶点都可以被看作是第一个顶点,任一顶点的邻接点之间也不存在次序关系. 仔细观察以下几张图,然后深刻领悟一下: 因为任意两个顶点之间都可能存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系(内存物理位置是线性的,图的元素关系是平面的). 如果用多重链表