图的邻接表实现(Java)
来源:互联网 发布:信信通是正规软件吗 编辑:程序博客网 时间:2024/06/05 09:10
图的邻接表实现(Java)
当图的结点多边少(又称为稀疏图)的时候,相比使用邻接矩阵存储,使用邻接表存储图的空间效率更高。
使用邻接表存储图的时候,图的每个结点对应一个边链表,也就是说,每个结点所包含的边构成一个链表。例如结点A和B相连,A也和C相连,若边e1表示A和B之间的边,e2表示A和C之间的边,那么结点A包含的边链表就是e1->e2,其中e1保存着A的临接点B,e2保存着A的临接点C。
Graph.java
import java.util.LinkedList;import java.util.Queue;import java.util.Stack;//实现图的邻接表结构class Edge {//边:作为邻接表中每个结点的边链表的元素,例如结点A和B构成边e1,那么A拥有e1,在A的边链表中,e1的verAdj = B int verAdj; int weight; Edge nextEdge;//如果结点A拥有多条边,边构成链表,例如e1->e2->...->en}class Vertex{ int verName; Edge edgeHead;//边链表的头指针}public class Graph { private Vertex[] vertexs; private boolean isDirected;//若为有向图,则isDirected为true Graph(int[] vexs,int[][] edges,boolean isDirected){//图的初始化 //vexs包含各顶点的编号,若有n个顶点,顶点的编号范围是0~n-1 //edges是一个n×3的数组,,边的权值等于edges[i][2],若为有向图,那么edges[i][0]指向edges[i][1] vertexs = new Vertex[vexs.length]; this.isDirected = isDirected; if(isDirected == false){//无向图的初始化 for (int j = 0; j < vexs.length; j++) { vertexs[j] = new Vertex(); vertexs[j].verName = vexs[j]; Edge cur = null; for (int i = 0; i < edges.length; i++) { if(edges[i][0] == vexs[j]){ if(vertexs[j].edgeHead == null){ vertexs[j].edgeHead = new Edge(); vertexs[j].edgeHead.verAdj = edges[i][1]; vertexs[j].edgeHead.weight = edges[i][2]; cur = vertexs[j].edgeHead; }else{ while(cur.nextEdge != null) cur = cur.nextEdge; cur.nextEdge = new Edge(); cur = cur.nextEdge; cur.verAdj = edges[i][1]; cur.weight = edges[i][2]; } }else if(edges[i][1] == vexs[j]){ if(vertexs[j].edgeHead == null){ vertexs[j].edgeHead = new Edge(); vertexs[j].edgeHead.verAdj = edges[i][0]; vertexs[j].edgeHead.weight = edges[i][2]; cur = vertexs[j].edgeHead; }else{ while(cur.nextEdge != null) cur = cur.nextEdge; cur.nextEdge = new Edge(); cur = cur.nextEdge; cur.verAdj = edges[i][0]; cur.weight = edges[i][2]; } } } } }else{//有向图的初始化 for (int j = 0; j < vexs.length; j++) { vertexs[j] = new Vertex(); vertexs[j].verName = vexs[j]; Edge cur = null; for (int i = 0; i < edges.length; i++) { if(edges[i][0] == vexs[j]){ if(vertexs[j].edgeHead == null){ vertexs[j].edgeHead = new Edge(); vertexs[j].edgeHead.verAdj = edges[i][1]; vertexs[j].edgeHead.weight = edges[i][2]; cur = vertexs[j].edgeHead; }else{ while(cur.nextEdge != null) cur = cur.nextEdge; cur.nextEdge = new Edge(); cur = cur.nextEdge; cur.verAdj = edges[i][1]; cur.weight = edges[i][2]; } } } } } } void bfs(){//广度优先遍历 if(vertexs == null || vertexs.length == 0) return; Queue<Vertex> queue = new LinkedList<Vertex>(); boolean[] visited = new boolean[vertexs.length]; for (int i = 0; i < visited.length; i++) { visited[i] = false; } queue.offer(vertexs[0]); visited[0] = true; System.out.print(vertexs[0].verName); while(!queue.isEmpty()){ Vertex v = queue.remove(); Edge e = v.edgeHead; while(e != null && visited[e.verAdj] == false){ queue.offer(vertexs[e.verAdj]); visited[e.verAdj] = true; System.out.print(e.verAdj + " "); e = e.nextEdge; } } } void dfsNonRec(){//邻接表非递归深度优先遍历 if(vertexs == null || vertexs.length == 0) return; boolean[] visited = new boolean[vertexs.length]; for (int i = 0; i < visited.length; i++) { visited[i] = false; } Stack<Vertex> stack = new Stack<Vertex>(); stack.push(vertexs[0]); visited[0] = true; while(!stack.isEmpty()){ Vertex v = stack.pop(); visited[v.verName] = true; System.out.print(v.verName + " "); Edge e = v.edgeHead; while(e != null && visited[e.verAdj] != true){ stack.push(vertexs[e.verAdj]); e = e.nextEdge; } } } void dfs(){//dfs和dfsRec共同实现邻接表存储的图的递归深度优先遍历 if(vertexs == null || vertexs.length == 0) return; boolean[] visited = new boolean[vertexs.length]; dfsRec(visited, vertexs[0]); } void dfsRec(boolean[] visited,Vertex vertex){ if(vertex == null) return; visited[vertex.verName] = true; System.out.print(vertex.verName + " "); Edge e = vertex.edgeHead; while(e != null){ if(visited[e.verAdj] != true){ dfsRec(visited, vertexs[e.verAdj]); } e = e.nextEdge; } } void printGraph(){ if(isDirected == false){ for (Vertex vertex : vertexs) { Edge e = vertex.edgeHead; while(e != null){ System.out.println(vertex.verName + "--" + e.verAdj + " weight = " + e.weight); e = e.nextEdge; } } }else{ for (Vertex vertex : vertexs) { Edge e = vertex.edgeHead; while(e != null){ System.out.println(vertex.verName + "->" + e.verAdj + " weight = " + e.weight); e = e.nextEdge; } } } }}
Main.java
public class Main{ public static void main(String[] args){ int[] vexs = {0,1,2,3,4,5}; int[][] edges = {{0,1,100},{0,2,100},{0,3,100},{1,4,100},{2,5,100},{4,5,100},{5,3,100}}; Graph g = new Graph(vexs, edges,true); g.bfs(); //g.dfs(); //g.dfsNonRec(); }}
阅读全文
0 0
- 图的邻接表实现(Java)
- 邻接表图java实现
- 图的邻接表实现
- 图的邻接表实现
- 图的邻接表实现
- 带权值的图的邻接表的java代码实现
- Java实现基于邻接表的图的建立
- Java实现基于邻接表的图的几个应用
- java版 图的邻接表、邻接矩阵、BFS、DFS 实现
- 邻接表存储图Java实现
- java实现邻接表图、DFS、BFS
- Java实现无向图邻接表
- 邻接表的实现
- 图的邻接表的实现(链表+数组)
- 图的邻接表的操作实现
- 图的邻接表的实现
- 图邻接表实现
- 邻接表实现图
- Java常见面试题—Callable与Runnable接口
- Halcon 与 c# 混合编程读取并显示一张图片
- 九度[1007]-奥运排序问题
- Win10下在VirtualBox中安装WinXP
- JFinal与JavaWeb对比总结
- 图的邻接表实现(Java)
- catalog start with + switch database to copy的妙用
- linux操作系统共有几种版本
- Python中学习器流水线Pipeline
- 简易版侧滑Demo
- 用python对文本格式的数据进行统计处理
- 视频会议十大开源项目排行
- 获取xml节点的值
- Hive学习笔记 --- Hive中创建分区表,并且查询数据