这是一个有向边带权的图 顶点数组:[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-12-28 14:11:23