為什么采用鄰接表實現?
因為在處理實際問題中,我們經常處理的是稀疏矩陣;

不可接受的;
實現類和方法:
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();
}
}
