一、图的应用
(一)、MGraph
package graph;
interface IGraph {
public int getVexNum();
public int getArcNum();
public int indexOfVex(String data);
public String valueOfVex(int index);
public void printMGraph();
}
public class MGraph implements IGraph {
public static final int INF = 999;
public String[] vexs;
public int[][] arcs;
public int vexNum;
public int arcNum;
public MGraph(String[] vertexs, int[][] adjMatrix) {
int num = vertexs.length;
int row = adjMatrix.length;
int col = adjMatrix[0].length;
if (row != col && row != num) {
throw new RuntimeException("row != col,邻接矩阵有误!");
}
vexNum = num;
vexs = new String[vexNum];
arcs = new int[vexNum][vexNum];
for (int i = 0; i < vexNum; i++) {
vexs[i] = vertexs[i];
}
for (int i = 0; i < vexNum; i++) {
for (int j = 0; j < vexNum; j++) {
arcs[i][j] = adjMatrix[i][j];
}
}
for (int i = 0; i < vexNum; i++) {
for (int j = 0; j < vexNum; j++) {
if (arcs[i][j] != 0 && arcs[i][j] != INF) {
arcNum++;
}
}
}
}
@Override
public int getVexNum() {
return this.vexNum;
}
@Override
public int getArcNum() {
return this.arcNum;
}
@Override
public int indexOfVex(String data) {
for (int i = 0; i < vexNum; i++) {
if (vexs[i] == data)
return i;
}
return -1;
}
@Override
public String valueOfVex(int index) {
if (index < 0 || index >= vexNum) {
throw new RuntimeException("位置错误!");
}
return vexs[index];
}
@Override
public void printMGraph() {
System.out.println("邻接矩阵:");
int t = 0;
for (int i = 0; i < arcs.length; i++) {
for (int j = 0; j < arcs.length; j++) {
System.out.printf("%4d", arcs[i][j]);
t++;
if (t % arcs.length == 0) {
System.out.println();
}
}
}
}
}
(二)、GraphApp
package graph;
import java.util.LinkedList;
public class GraphApp extends MGraph {
public GraphApp(String[] vertexs, int[][] adjMatrix) {
super(vertexs, adjMatrix);
}
boolean[] visited;
public int indexOfFirstNeighbor(int v) {
for (int i = 0; i < vexNum; i++) {
if (arcs[v][i] > 0) {
return i;
}
}
return -1;
}
public int indexOfNextNeighbor(int v1, int v2) {
for (int i = v2 + 1; i < vexNum; i++) {
if (arcs[v1][i] > 0) {
return i;
}
}
return -1;
}
private void DFSTraverse(boolean[] isVisited, int v) {
System.out.print(valueOfVex(v) + "->");
visited[v] = true;
int w = indexOfFirstNeighbor(v);
while (w != -1) {
if (!visited[w]) {
DFSTraverse(visited, w);
}
w = indexOfNextNeighbor(v, w);
}
}
public void DFSTraverse() {
System.out.println("深度优先搜索遍历:");
visited = new boolean[vexNum];
for (int i = 0; i < vexNum; i++) {
if (!visited[i]) {
DFSTraverse(visited, i);
}
}
System.out.print("NULL");
}
private void BFSTraverse(boolean[] isVisited, int v) {
int u;
int w;
LinkedList<Integer> queue = new LinkedList<Integer>();
System.out.print(valueOfVex(v) + "->");
visited[v] = true;
queue.addLast(v);
while (!queue.isEmpty()) {
u = (Integer) queue.removeFirst();
w = indexOfFirstNeighbor(u);
while (w != -1) {
if (!visited[w]) {
System.out.print(valueOfVex(w) + "->");
visited[w] = true;
queue.addLast(w);
}
w