邻接矩阵的深度优先遍历(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);//深度优先遍历图 } }
本文来自博客园,作者:wzyy,转载请注明原文链接:https://www.cnblogs.com/wwzyy/p/6208634.html