程序中用到的栈和队列实现请参见另外的博文。 package test2; class Vertex{ private char vertexName; public boolean wasVisited; public Vertex(char name){ vertexName = name; wasVisited = false; } public void displayVertexName(){ System.out.println(" name:"+vertexName); } } public class Graph { private int MAX_VERTEX; private Vertex[] vertexList; private Stack stack; private queue que; private int adjMatrix[][]; private int nVertex; public Graph(int max){ MAX_VERTEX = max; vertexList = new Vertex[MAX_VERTEX]; stack = new Stack(MAX_VERTEX);//深度遍历使用 que = new queue(MAX_VERTEX);//广度遍历使用 adjMatrix = new int[MAX_VERTEX][MAX_VERTEX]; nVertex = 0; for(int i = 0; i < MAX_VERTEX; i++){ for(int j = 0; j< MAX_VERTEX ; j++){ adjMatrix[i][j] = 0; } } } public boolean addVertex(char name){ if(nVertex < MAX_VERTEX){ vertexList[nVertex++] = new Vertex(name);; return true; } else{ return false; } } public boolean addEdge(int startVertex, int endVertex){ if(startVertex < nVertex && endVertex < nVertex){ adjMatrix[startVertex][endVertex] = 1; adjMatrix[endVertex][startVertex] = 1; return true; }else{ return false; } } public int getUnvisitedVertex(int j){//获取与该顶点邻接的未访问顶点 for(int i = 0; i < nVertex ; i++){ if(adjMatrix[j][i] == 1 && vertexList[i].wasVisited == false){//可达,又未被访问过 return i; } } return -1; } public void depthFirstSearch(){ stack.push(0);//首先将第0个元素入栈; //vertexList[0].displayVertexName();//******若要输出该图的最小生成树,则删掉这行代码; vertexList[0].wasVisited = true;//标识为已访问 while(!stack.isEmpty()){//若栈不空 int unvisitedVer = getUnvisitedVertex(stack.getTopValue());//获取一个与该顶点邻接的未访问顶点 if(unvisitedVer != -1){ //存在与这个点相连的未访问顶点; vertexList[stack.getTopValue()].displayVertexName();<span style="color:#FF0000;">//******若要输出该图的最小生成树,则加上这行代码;</span> vertexList[unvisitedVer].displayVertexName();//访问它,并标识为已访问 vertexList[unvisitedVer].wasVisited = true; System.out.println(" "); stack.push(unvisitedVer);//入栈 }else{//与该顶点相连的所有顶点均被访问过,将该顶点出栈; stack.pop(); } }// for(int i = 0; i< nVertex; i++){//重置顶点均未被访问过,保证下次遍历能进行。 vertexList[i].wasVisited = false; } } public void breadthFirstSearch(){ que.insert(0); vertexList[0].displayVertexName(); vertexList[0].wasVisited = true; while(!que.isEmpty()){ int unvisit = getUnvisitedVertex(que.getFrontElement()); if(unvisit != -1){ vertexList[unvisit].displayVertexName(); vertexList[unvisit].wasVisited = true; que.insert(unvisit); }else{ que.remove(); } } for(int i=0; i< nVertex ; i++){ vertexList[i].wasVisited = false; } } } class GraphApp{ public static void main(String args[]){ Graph g = new Graph(9); g.addVertex('A'); g.addVertex('B'); g.addVertex('C'); g.addVertex('D'); g.addVertex('E'); g.addVertex('F'); g.addEdge(0, 1); g.addEdge(1, 2); //g.addEdge(2, 3); g.addEdge(3, 4); g.addEdge(4, 5); g.addEdge(1, 4); g.addEdge(1, 5); g.addEdge(3, 5); //g.breadthFirstSearch(); g.depthFirstSearch(); } }
最小生成树运行结果:
name:A name:B name:B name:C name:B name:E name:E name:D name:D name:F