這是一個有向邊帶權的圖
頂點數組:[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);//深度優先遍歷圖 } }