基本介绍
- 当需要表示多对多的关系时,就要用到图
- 图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)
- 图的遍历方式:深度优先遍历;广度优先遍历
深度优先遍历
广度优先遍历
两种遍历方式的比较
代码实现
package graph;
import java.util.ArrayList;
import java.util.Arrays;
public class Graph {
private ArrayList<String> vertexList ;
private int[][] edges;
private int numOfEdges;
private boolean[] isVisit;
private ArrayList<Integer> list ;
public static void main(String[] args) {
Graph graph1 = new Graph(5);
Graph graph2 = new Graph(8);
String[] strList = { "A", "B", "C", "D", "E" };
String[] strList2 = { "1", "2", "3", "4", "5", "6", "7", "8" };
for (String s : strList2) {
graph2.addVertex(s);
}
graph2.addEdge(0, 1, 1);
graph2.addEdge(0, 2, 1);
graph2.addEdge(1, 3, 1);
graph2.addEdge(1, 4, 1);
graph2.addEdge(2, 5, 1);
graph2.addEdge(2, 6, 1);
graph2.addEdge(3, 7, 1);
graph2.addEdge(4, 7, 1);
graph2.addEdge(5, 6, 1);
graph2.showGraph();
graph2.bfs(0);
}
public Graph() {
super();
}
public Graph(int n) {
super();
vertexList = new ArrayList<String>(n);
edges = new int[n][n];
numOfEdges = 0;
isVisit = new boolean[n];
list = new ArrayList<Integer>(n);
}
public void addVertex(String vertex) {
vertexList.add(vertex);
}
public void addEdge(int m,int n,int w) {
edges[m][n] = w;
edges[n][m] = w;
numOfEdges++;
}
public int numOfVertex() {
return vertexList.size();
}
public int numOfEdge() {
return numOfEdges;
}
public String getVertex(int i) {
return vertexList.get(i);
}
public int getWeight(int m,int n) {
return edges[m][n];
}
public void showGraph() {
for(int[] line:edges) {
System.out.println(Arrays.toString(line));
}
}
public void setIsVisit(int i,boolean bool) {
isVisit[i] = bool;
}
public void dfs(int index) {
String s = getVertex(index);
setIsVisit(index,true);
System.out.print(s+"->");
for(int i = 0;i<numOfVertex();i++) {
if(edges[index][i]==1&&isVisit[i]==false) {
dfs(i);
}
}
}
public void bfs(int index) {
if(index==0) {
setIsVisit(index,true);
System.out.print(getVertex(index)+"->");
}
String s = getVertex(index);
for(int j=0;j<numOfVertex();j++) {
if(edges[index][j]==1&&isVisit[j]==false) {
setIsVisit(j,true);
list.add(j);
System.out.print(getVertex(j)+"->");
}
}
if(list.size()!=0) {
int i =list.remove(0);
bfs(i);
}
else {
return;
}
}
}