实际案例
代码实现
package com. atguigu. graph; import java. util. ArrayList;
import java. util. Arrays;
import java. util. LinkedList;
public class Graph { private ArrayList< String> vertexList; private int [ ] [ ] edges; private int numOfEdges; private boolean [ ] isVisited; public static void main ( String[ ] args) { int n= 8 ;
String Vertexs[ ] = { "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" } ; Graph graph = new Graph ( n) ; for ( String vertex: Vertexs) { graph. insertVertex ( vertex) ; }
graph. insertEdge ( 0 , 1 , 1 ) ; graph. insertEdge ( 0 , 2 , 1 ) ; graph. insertEdge ( 1 , 3 , 1 ) ; graph. insertEdge ( 1 , 4 , 1 ) ; graph. insertEdge ( 3 , 7 , 1 ) ; graph. insertEdge ( 4 , 7 , 1 ) ; graph. insertEdge ( 2 , 5 , 1 ) ; graph. insertEdge ( 2 , 6 , 1 ) ; graph. insertEdge ( 5 , 6 , 1 ) ; graph. showGraph ( ) ; System. out. println ( "深度优先" ) ; graph. dfs ( ) ; System. out. println ( ) ; System. out. println ( "广度优先" ) ; graph. bfs ( ) ; } public Graph ( int n) { edges = new int [ n] [ n] ; vertexList = new ArrayList < > ( n) ; numOfEdges= 0 ;
} public int getFirstNeighbor ( int index) { for ( int j = 0 ; j < vertexList. size ( ) ; j++ ) { if ( edges[ index] [ j] > 0 ) { return j; } } return - 1 ; } public int getNextNeighbor ( int v1, int v2) { for ( int j= v2+ 1 ; j< vertexList. size ( ) ; j++ ) { if ( edges[ v1] [ j] > 0 ) { return j; } } return - 1 ; } public void dfs ( boolean [ ] isVisited, int i) { System. out. print ( getValueByIndex ( i) + "->" ) ; isVisited[ i] = true ; int w= getFirstNeighbor ( i) ; while ( w!= - 1 ) { if ( ! isVisited[ w] ) { dfs ( isVisited, w) ; } w= getNextNeighbor ( i, w) ; } } public void dfs ( ) { isVisited= new boolean [ vertexList. size ( ) ] ; for ( int i = 0 ; i < getNumOfVertex ( ) ; i++ ) { if ( ! isVisited[ i] ) { dfs ( isVisited, i) ; } } } public void bfs ( boolean [ ] isVisited, int i) { int u; int w; LinkedList queue = new LinkedList ( ) ; System. out. print ( getValueByIndex ( i) + "=>" ) ; isVisited[ i] = true ; queue. addLast ( i) ; while ( ! queue. isEmpty ( ) ) { u = ( Integer) queue. removeFirst ( ) ; w= getFirstNeighbor ( u) ; while ( w!= - 1 ) { if ( ! isVisited[ w] ) { System. out. print ( getValueByIndex ( w) + "=>" ) ; isVisited[ w] = true ; queue. addLast ( w) ; } w= getNextNeighbor ( u, w) ; } } } public void bfs ( ) { isVisited= new boolean [ vertexList. size ( ) ] ; for ( int i = 0 ; i < getNumOfVertex ( ) ; i++ ) { if ( ! isVisited[ i] ) { bfs ( isVisited, i) ; } } } public int getNumOfVertex ( ) { return vertexList. size ( ) ; } public void showGraph ( ) { for ( int [ ] link: edges) { System. out. println ( Arrays. toString ( link) ) ; } } public int getNumOfEdges ( ) { return numOfEdges; } public String getValueByIndex ( int i) { return vertexList. get ( i) ; } public int getWeight ( int v1, int v2) { return edges[ v1] [ v2] ; } public void insertVertex ( String vertex) { vertexList. add ( vertex) ; } public void insertEdge ( int v1, int v2, int weight) { edges[ v1] [ v2] = weight; edges[ v2] [ v1] = weight; numOfEdges++ ; } }