图结构
1. 图的构建
<pre>
package GraphPackage;
import java.util.Arrays;
class Edge{
String beginCity;
String endCity;
int cost;
public Edge(String beginCity, String endCity, int cost) {
super();
this.beginCity = beginCity;
this.endCity = endCity;
this.cost = cost;
}
}
public class Graph {
String[] cityArray;
int[][] matrix;
int size;
public Graph(String[] cityArray, Edge[] edges, boolean direction) {
this.cityArray = cityArray;
this.size = cityArray.length;
matrix = new int[size][size];
for (Edge edge: edges) {
int i = findIndex(edge.beginCity,cityArray);
int j = findIndex(edge.endCity,cityArray);
matrix[i][j] = edge.cost;
if(!direction) {
matrix[j][i] = edge.cost;
}
}
}
public int findIndex(String city, String[] cityArray) {
for (int i = 0; i < cityArray.length; i++) {
if(city.equals(cityArray[i])) {
return i;
}
}
return -1;
}
public void graphPrint() {
for (int[] ii : matrix) {
System.out.println(Arrays.toString(ii));
}
}
}
</pre>
2. 深度优先搜索
<pre>
public void dfs(int start, int[] visit) {
System.out.println(cityArray[start] + " ");
visit[start] =1;
for (int i = 0; i < visit.length; i++) {
if (matrix[start][i] > 0 && visit[i] == 0) {
dfs(i, visit);
}
}
}
</pre>
3. 广度优先搜索
<pre>
public void bfs(int start) {
int[] visit = new int[size];
Queue queue = new Queue(100);
queue.inputData(start);
while(!queue.isEmpty()) {
int index = queue.outputData();
System.out.println(cityArray[index]);
visit[index] = 1;
for (int i = 0; i < visit.length; i++) {
if(matrix[index][i] != 0 && visit[i] == 0) {
queue.inputData(i);
visit[i] = 1;
}
}
}
}
</pre>
4. 测试
<pre>
package GraphPackage;
import java.util.ArrayList;
public class GraphTest {
public static void main(String[] args) {
Graph graph = creatGraph(false);
System.out.println("图矩阵如下:");
graph.graphPrint();
int[] visit = new int[graph.size];
System.out.println("深度优先搜索顺序如下:");
graph.dfs(0, visit);
System.out.println("广度优先搜索顺序如下:");
graph.bfs(0);
}
public static Graph creatGraph(boolean direction) {
String[] citys = {"北京","上海","广州","重庆","武汉","南昌"};
ArrayList<Edge> edgeList = new ArrayList<Edge>();
edgeList.add(new Edge("北京","广州",10));
edgeList.add(new Edge("北京","上海",11));
edgeList.add(new Edge("上海","南昌",6));
edgeList.add(new Edge("广州","重庆",14));
edgeList.add(new Edge("广州","武汉",9));
edgeList.add(new Edge("重庆","武汉",20));
edgeList.add(new Edge("武汉","北京",13));
edgeList.add(new Edge("武汉","南昌",12));
edgeList.add(new Edge("南昌","广州",18));
Edge[] edgeArray = new Edge[edgeList.size()];
return new Graph(citys,edgeList.toArray(edgeArray),direction);
}
}
</pre>