package com.graph;
import java.util.ArrayList;
public class Graph {
private ArrayList<String> vertexList;//放顶点的集合
private int[][] edges;//存放边
private int numOfEdges;//表示边的数目
//创建一个数组表示该点是否被访问
public boolean[] isVisited;
public static void main(String[] args) {
int n = 5;//节点的个数
String[] value = {"A", "B", "C", "D", "E"};
Graph graph = new Graph(n);
//添加点
for(String v:value) {
graph.insertVertex(v);
}
//添加边
//A-B A-C B-D B-E
graph.insertEdge(0, 1, 1);
graph.insertEdge(0, 2, 1);
graph.insertEdge(1, 2, 1);
graph.insertEdge(1, 3, 1);
graph.insertEdge(1, 4, 1);
graph.showGraph();
graph.dfs();
}
//深度优先遍历算法
public void dfs(boolean[] isVisited, int i) {
//首先输出该节点
System.out.print(getValueByIndex(i)+"->");
//将该节点设置为已经访问
isVisited[i] = true;
//查找节点i的第一个邻接节点w
int w = getFirstNeighbor(i);
//如果有
while (w != -1) {
//没有被访问过
if(!isVisited[w]) {
dfs(isVisited, w);
}
//如果w已经被访问,就访问下一个节点
//这里i可以理解为矩阵的第几行,w是矩阵的第几列
w = getNextNeighbar(i, w);
}
}
//对dfs进行一个重载,遍历我们所有的节点,进行dfs
public void dfs() {
for(int i = 0; i < vertexList.size(); i++) {
if(!isVisited[i]) {//当前节点没有被访问
dfs(isVisited, i);
}
}
}
//得到第一个零节点的下一个节点的位置,还是从0开始,没找到返回-1,找到返回节点在集合中的位置
public int getFirstNeighbor(int index) {
for(int j = 0; j < vertexList.size(); j++) {
if(edges[index][j] > 0) {
return j;
}
}
return -1;
}
//根据前一个邻接节点的下标获取下一个邻接节点,即该节点不满足要求时访问下一个
public int getNextNeighbar(int v1, int v2) {
for (int j = v2 + 1; j < vertexList.size(); j++) {
if(edges[v1][j] > 0) {
return j;
}
}
return -1;
}
//返回v1和v2的权值
public int getWeight(int v1, int v2) {
return edges[v1][v2];
}
public Graph(int n) {
//初始化集合矩阵
edges = new int[n][n];
vertexList = new ArrayList<>();
numOfEdges = 0;//边不知道多少条,先为0
isVisited = new boolean[5];
}
//返回节点的个数
public int getNumOfVertex() {
return vertexList.size();
}
//得到边的个数
public int getNumOfEdges() {
return numOfEdges;
}
//获取第i个节点的下标
public String getValueByIndex(int i) {
return vertexList.get(i);
}
//插入节点
public void insertVertex(String vertex) {
vertexList.add(vertex);
}
//添加边
/**
*
* @param v1
* @param v2
* @param weight
*/
public void insertEdge(int v1, int v2, int weight) {
edges[v1][v2] = weight;
edges[v2][v1] = weight;
numOfEdges++;
}
//显示图对应的矩阵
public void showGraph() {
for(int[] rows: edges) {
for(int cols : rows) {
System.out.print(cols+"\t");
}
System.out.println();
}
}
}