无向图(邻接表实现)
为什么采用邻接表实现?
因为在处理实际问题中,我们经常处理的是稀疏矩阵;
不可接受的;
实现类和方法:
1.点的定义;
2.图的构造方法;
3.增加点;
4.增加边;
5.删除边;
6.打印顶点表;
7.打印邻接表;
测试只用了5个点,主要是实现图;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | /** * FileName: Graph * Author: Jerry * Date: 2020/2/7 16:38 * Description: 图及深度搜索和广度搜索 */ package Graph_DFS_AND_BFS; import java.util.*; public class Graph { //图的顶点集合 private Set<Vertex> vertexSet = new HashSet<Vertex>(); //图的邻接表集合 private Map<Vertex,List<Vertex>> vertexListMap= new HashMap<Vertex,List<Vertex>>(); //空的构造函数 public Graph(){ } //带有参数的构造函数 public Graph(Set<Vertex> set,Map<Vertex,List<Vertex>> vertexListMap){ this .vertexSet=set; this .vertexListMap=vertexListMap; for (Vertex vertex: this .vertexSet){ vertex.isVisiable= false ; } //初始化 } public Set<Vertex> getVertexSet(){ return vertexSet; } public Map<Vertex,List<Vertex>> getVertexListMap(){ return vertexListMap; } //插入边 public void putEdge(Vertex vertex1,Vertex vertex2){ if (!vertexSet.contains(vertex1)){ vertexSet.add(vertex1); LinkedList<Vertex> vertexList1 = new LinkedList<Vertex>(); vertexList1.add(vertex2); vertexListMap.put(vertex1,vertexList1); } else { vertexListMap.get(vertex1).add(vertex2); } if (!vertexSet.contains(vertex2)){ vertexSet.add(vertex2); LinkedList<Vertex> vertexList2 = new LinkedList<Vertex>(); vertexList2.add(vertex1); vertexListMap.put(vertex2,vertexList2); } else { vertexListMap.get(vertex2).add(vertex1); } } //插入点 public void putVertex(Vertex vertex){ if (vertexSet.contains(vertex)) return ; else { vertexSet.add(vertex); LinkedList<Vertex> vertexlist = new LinkedList<Vertex>(); vertexListMap.put(vertex,vertexlist); } } //打印顶点集 public void printVertex(){ System.out.println( "顶点集为:" ); for (Vertex vertex:vertexSet){ System.out.print( " " +vertex.name); } } //打印邻接表 public void printEdge(){ System.out.println( "邻接表为:" ); for (Vertex vertex:vertexSet){ System.out.print( "与" +vertex.name+ "临接的点为:" ); List<Vertex> vertexList = getVertexListMap().get(vertex); if (vertexList!= null ){ for (Vertex vertex1:vertexList){ System.out.print(vertex1.name+ " " ); } } System.out.println(); } } //删除边 public void deleteEdge(Vertex vertex1,Vertex vertex2){ if (!vertexSet.contains(vertex1)||!vertexSet.contains(vertex2)){ System.out.println( "输入错误!无法操作!" ); return ; } getVertexListMap().get(vertex1).remove(vertex2); getVertexListMap().get(vertex2).remove(vertex1); } public boolean equal(Vertex vertex1,Vertex vertex2){ if (vertex1.name==vertex2.name){ return true ; } else { return false ; } } //删除点,复杂度较高,需要遍历邻接表,应该不会被使用 //顶点类 static class Vertex{ int name; int weight; boolean isVisiable; Vertex( int data){ this .name = data; } } public static void main(String []args){ Graph graph = new Graph(); Vertex vertex0 = new Vertex( 0 ); Vertex vertex1 = new Vertex( 1 ); Vertex vertex2 = new Vertex( 2 ); Vertex vertex3 = new Vertex( 3 ); Vertex vertex4 = new Vertex( 4 ); graph.putEdge(vertex0,vertex1); graph.putEdge(vertex0,vertex2); graph.putEdge(vertex1,vertex3); graph.putEdge(vertex2,vertex3); graph.putVertex(vertex4); graph.deleteEdge(vertex1,vertex3); graph.printVertex(); graph.printEdge(); } } |
如果你觉得博客内容有帮助,请收藏书签。
版权声明:转载文章之后必须在文章页面给出原文连接(创意共享3.0许可证)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库