Java实现图:邻接矩阵表示、深度优先搜索、广度优先搜索、无向图的最小生成树
2015-03-27 15:36
831 查看
程序中用到的栈和队列实现请参见另外的博文。 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
相关文章推荐
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径
- 深度优先搜索 DFS(邻接矩阵表示)
- 邻接表c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
- 深度优先搜索、广度优先搜索(java)
- 深度优先搜索解决 踏青问题 java实现
- 图的表示、广度优先搜索、深度优先搜索
- Java实现数据结构之深度优先搜索DFS和广度优先搜索BFS
- 广度优先搜索与深度优先搜索的 java 实现
- 图的遍历和生成树求解实现|图遍历,生成树,实现,邻接矩阵,邻接表,深度广度遍历,最小生成树
- 数据结构(C#)--图结构的实现输出以及图结构的深度和广度优先搜索和Dijkstra 算法的最小路径以及最小生成树的实现
- 图的深度优先(非递归)、广度优先、最小生成树的C++实现
- (算法入门)基本图论-深度优先搜索之JAVA实现
- 有向图和无向图邻接矩阵的输入输出,深度深度优先搜索,广度优先搜索
- 基于邻接矩阵实现的DFS深度优先搜索
- 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
- 无权图无向图【邻接矩阵存储】深度搜索和广度搜索--Java实现
- java 图的邻接矩阵表示,深度优先遍历,广度优先遍历
- 邻接表 邻接矩阵 广度优先搜索 深度优先搜索