package 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 edgeNum;
private boolean[] isVisit;
public static void main(String[] args) {
String[] vertexs = {"A", "B", "C", "D", "E"};
String[] vertexs1 = {"1", "2", "3", "4", "5", "6", "7", "8"};
Graph graph = new Graph(5);
Graph graph1 = new Graph(8);
for (int i = 0; i < vertexs.length; i++) {
graph.addVertex(vertexs[i]);
}
for (int i = 0; i < vertexs1.length; i++) {
graph1.addVertex(vertexs1[i]);
}
graph.addEdeg(0, 1, 1);
graph.addEdeg(0, 2, 1);
graph.addEdeg(2, 1, 1);
graph.addEdeg(1, 3, 1);
graph.addEdeg(1, 4, 1);
graph1.addEdeg(0, 1, 1);
graph1.addEdeg(0, 2, 1);
graph1.addEdeg(1, 3, 1);
graph1.addEdeg(1, 4, 1);
graph1.addEdeg(3, 7, 1);
graph1.addEdeg(4, 7, 1);
graph1.addEdeg(2, 5, 1);
graph1.addEdeg(2, 6, 1);
graph1.addEdeg(5, 6, 1);
graph.show();
System.out.println("深度优先!");
graph.deepFirstSearch();
graph.resetVisit();
System.out.println();
System.out.println("广度优先!");
graph.breadFirstSearch();
System.out.println("--------------------------------split---------------------------------------");
graph1.show();
System.out.println("深度优先!");
graph1.deepFirstSearch();
graph1.resetVisit();
System.out.println();
System.out.println("广度优先!");
graph1.breadFirstSearch();
}
public Graph(int n){
vertexList = new ArrayList<>(n);
edges = new int[n][n];
edgeNum = 0;
isVisit = new boolean[n];
}
public int getFirstNeighbor(int index){
for(int i = 0; i < vertexList.size(); i++){
int temp = edges[index][i];
if(temp > 0){
return i;
}
}
return -1;
}
public int getNextNeighbor(int v1, int v2){
for (int i = 1 + v2; i < vertexList.size(); i++) {
if(edges[v1][i] > 0){
return i;
}
}
return -1;
}
public void breadFirstSearch(){
for (int i = 0; i < vertexList.size(); i++) {
if(!isVisit[i]){
breadFirstSearch(isVisit , i);
}
}
}
public void breadFirstSearch(boolean[] isVisit, int i){
System.out.print(vertexList.get(i) + "=>");
isVisit[i] = true;
LinkedList<Integer> queue = new LinkedList<>();
queue.addLast(i);
while (!queue.isEmpty()){
Integer u = queue.removeFirst();
int w = getFirstNeighbor(u);
while (w != -1){
if(!isVisit[w]){
System.out.print(vertexList.get(w) + "=>");
isVisit[w] = true;
queue.addLast(w);
}
w = getNextNeighbor(u, w);
}
}
}
public void deepFirstSearch(boolean[] isVisit , int i){
System.out.print(vertexList.get(i) + "-->");
isVisit[i] = true;
int w = getFirstNeighbor(i);
while (w != -1){
if(!isVisit[w]){
deepFirstSearch(isVisit , w);
}
w = getNextNeighbor(i , w);
}
}
public void deepFirstSearch(){
for (int i = 0; i < vertexList.size(); i++) {
if(!isVisit[i]){
deepFirstSearch(isVisit , i);
}
}
}
public void addVertex(String vertex){
vertexList.add(vertex);
}
public void addEdeg(int v1 , int v2, int weight){
edges[v1][v2] = weight;
edges[v2][v1] = weight;
edgeNum++;
}
public int getVertexNum(){
return vertexList.size();
}
public int getEdgeNum(){
return edgeNum;
}
public String getVertexByIndex(int index){
return vertexList.get(index);
}
public int getWeight(int v1, int v2){
return edges[v1][v2];
}
public void show(){
for (int[] edge : edges) {
System.out.println(Arrays.toString(edge));
}
}
public void resetVisit(){
for (int i = 0; i < isVisit.length; i++) {
isVisit[i] = false;
}
}
}