看了一些书与网上一些例子后,对图进行了一些总结:
1,定义图的数据结构:
class Graph{ //定义一个图结构
int n ; //图的点的数量
boolean visited[] = new boolean[n] ; //遍历标志
int matrix [][] = new int[n][n] ; //图的邻接矩阵
char vertex[] = new char[n] ; //点的标志字符
public Graph(int n){ //构造函数
this.n = n ;
}
}
2,图的深度优先遍历与广度优先遍历:
public static void deptSearch(Graph g , int x){ //深度优先遍历
for (int i = 0; i < g.n; i++) {
if(g.visited[i]==false&&g.matrix[x][i]==1){
g.visited[i] = true ;
visit(g,i) ;
deptSearch(g, i) ;
}
}
}
public static void widthSearch(Graph g , int x){ //广度优先遍历
LinkedList<Integer> queue = new LinkedList<Integer>() ; //定义一个队列存储图遍历时的点
queue.add(x) ; //访问第一个元素
g.visited[x] = true ; //第一个标志为true
visit(g,x) ;
while(queue.size()!=0){
int k = queue.pollFirst() ; //获取队列第一个元素
for (int i = 0; i < g.n; i++) {
if(g.visited[i]==false&&g.matrix[k][i]==1){
g.visited[i] = true ; //遍历的标志位true
queue.add(i) ; //插入队列
visit(g,i) ;
}
}
}
}
public static void visit(Graph g,int i){
System.out.print("->"+g.vertex[i]);
}
3,测试例子:
public class Main {
private static Scanner scanner = new Scanner(System.in) ;
public static void main(String[] args) {
System.out.println("请输入图的点的数目:") ;
int n = scanner.nextInt() ; //输入图的点的数目
Graph g = new Graph(n) ;
int matrix[][] = new int[n][n] ; //图的邻接矩阵
System.out.println("请输入图的邻接矩阵:") ;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
matrix[i][j] = scanner.nextInt() ;
}
}
char []vertex = {'a','b','c','d','e','f','g'} ; //定义图的点的字符
boolean visited[] = new boolean[n] ; //定义访问标志
for (int i = 0; i < visited.length; i++) { //全部标记为未遍历
visited[i] = false ;
}
g.matrix = matrix ;
g.visited = visited ;
g.vertex = vertex ;
System.out.println("深度度优先遍历---------------------------------------");
System.out.print("遍历序列:");
deptSearch(g, 0) ;
System.out.println();
for (int i = 0; i < visited.length; i++) { //全部标记为未遍历
visited[i] = false ;
}
System.out.println("广度优先遍历---------------------------------------");
System.out.print("遍历序列:");
widthSearch(g, 0) ;
}
}
程序运行结果:
测试例子:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
请输入图的点的数目:
7
请输入图的邻接矩阵:
1 0 1 1 1 1 0
0 1 1 1 0 1 1
1 1 1 0 0 0 0
1 1 0 1 0 0 0
1 0 0 0 1 0 1
1 1 0 0 0 1 1
0 1 0 0 1 1 1
深度度优先遍历---------------------------------------
遍历序列:->a->c->b->d->f->g->e
广度优先遍历---------------------------------------
遍历序列:->a->c->d->e->f->b->g