zoukankan      html  css  js  c++  java
  • 邻接矩阵的深度优先遍历(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]+" "); } 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);//深度优先遍历图 } }

  • 相关阅读:
    2018年9月28日CCPC秦皇岛站参赛总结
    数学:二次剩余与n次剩余
    数学:拓展Lucas定理
    BZOJ2301:莫比乌斯反演+二维容斥解决GCD范围计数
    数学:莫比乌斯反演-约数个数和
    数学:莫比乌斯反演-GCD计数
    关于cnblogs至github上blog的搬迁
    友链——一群dalao
    折半搜索(meet in the middle)
    关于爆搜
  • 原文地址:https://www.cnblogs.com/wwzyy/p/6208634.html
Copyright © 2011-2022 走看看