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) {
vertexList = new ArrayList<>(n);
edges = new int[n][n];
numOfEdges = 0;
}
public void insertEdge(int v1, int v2, int wight) {
edges[v1][v2] = wight;
edges[v2][v1] = wight;
numOfEdges++;
}
public void showGraph() {
for (int[] edge : edges) {
System.out.println(Arrays.toString(edge));
}
}
public int getNumOfVertex() {
return vertexList.size();
}
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 int getFirstNeighbour(int index) {
for (int i = 0; i < vertexList.size(); i++) {
if (edges[index][i] == 1) {
return i;
}
}
return -1;
}
public int getNextNeighbour(int n, int index) {
for (int i = index + 1; i < vertexList.size(); i++) {
if (edges[n][i] == 1) {
return i;
}
}
return -1;
}
private void dfs(boolean[] isVisited, int n) {
System.out.print(" ->" + getValueByIndex(n));
isVisited[n] = true;
int w = getFirstNeighbour(n);
while (w != -1) {
if (!isVisited[w]) {
dfs(isVisited, w);
}
w = getNextNeighbour(n, w);
}
}
public void dfs() {
isVisited = new boolean[getNumOfVertex()];
for(int i=0;i<vertexList.size();i++){
if(!isVisited[i]){
dfs(isVisited,i);
}
}
}
private void bfs(boolean[] isVisited, int i){
LinkedList<Integer> queue = new LinkedList<Integer>();
System.out.print(" =>"+getValueByIndex(i));
isVisited[i] = true;
queue.addLast(i);
while(!queue.isEmpty()){
Integer u = queue.removeFirst();
int w = getFirstNeighbour(u);
while( w != -1){
if(!isVisited[w]){
System.out.print(" =>"+getValueByIndex(w));
isVisited[w] = true;
queue.addLast(w);
}
w = getNextNeighbour(u,w);
}
}
}
public void bfs(){
isVisited = new boolean[getNumOfVertex()];
for(int i=0; i<getNumOfVertex();i++){
if(!isVisited[i]){
bfs(isVisited,i);
}
}
}
}