無向圖(鄰接表實現)


為什么采用鄰接表實現?

因為在處理實際問題中,我們經常處理的是稀疏矩陣;

不可接受的;

   

實現類和方法:

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();
    }
}

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM