為什么采用鄰接表實現?
因為在處理實際問題中,我們經常處理的是稀疏矩陣;
不可接受的;
實現類和方法:
1.點的定義;
2.圖的構造方法;
3.增加點;
4.增加邊;
5.刪除邊;
6.打印頂點表;
7.打印鄰接表;
測試只用了5個點,主要是實現圖;
/** * 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(); } }