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


