实际案例
代码实现
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++;
}
}