
这是一个有向边带权的图
顶点数组:[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);//深度优先遍历图
}
}


