Java数据结构与算法(有向图)

前言

有向图(Directed Graph)是一种由顶点和有方向的边组成的图数据结构。

实现原理

使用邻接表表示法实现有向图相对简单明了,步骤也相对简单。

1:首先创建有向图

2.创建顶点

3.顶点间创建边

具体代码实现

java 复制代码
package test13;

import java.util.*;
class Vertex {
    private String label;

    public Vertex(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Vertex vertex = (Vertex) obj;
        return label.equals(vertex.label);
    }

    @Override
    public int hashCode() {
        return label.hashCode();
    }

    @Override
    public String toString() {
        return label;
    }
}




class DirectedGraph {
    private Map<Vertex, List<Vertex>> adjVertices;

    public DirectedGraph() {
        adjVertices = new HashMap<>();
    }

    public void addVertex(String label) {
        adjVertices.putIfAbsent(new Vertex(label), new ArrayList<>());
    }

    public void removeVertex(String label) {
        Vertex v = new Vertex(label);
        adjVertices.values().forEach(e -> e.remove(v));
        adjVertices.remove(new Vertex(label));
    }

    public void addEdge(String label1, String label2) {
        Vertex v1 = new Vertex(label1);
        Vertex v2 = new Vertex(label2);
        adjVertices.get(v1).add(v2);
    }

    public void removeEdge(String label1, String label2) {
        Vertex v1 = new Vertex(label1);
        Vertex v2 = new Vertex(label2);
        List<Vertex> eV1 = adjVertices.get(v1);
        if (eV1 != null)
            eV1.remove(v2);
    }

    public List<Vertex> getAdjVertices(String label) {
        return adjVertices.get(new Vertex(label));
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (Vertex v : adjVertices.keySet()) {
            sb.append(v).append(": ");
            for (Vertex w : adjVertices.get(v)) {
                sb.append(w).append(" ");
            }
            sb.append("\n");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        DirectedGraph graph = new DirectedGraph();
        graph.addVertex("A");
        graph.addVertex("B");
        graph.addVertex("C");
        graph.addVertex("D");

        graph.addEdge("A", "B");
        graph.addEdge("A", "C");
        graph.addEdge("B", "C");
        graph.addEdge("C", "D");

        System.out.println(graph);
    }
}

QA:待定

相关推荐
一匹电信狗几秒前
【牛客CM11】链表分割
c语言·开发语言·数据结构·c++·算法·leetcode·stl
2501_938963965 分钟前
解析 Lua 虚拟机整数与浮解析 Lua 虚拟机整数与浮点数处理:类型转换与运算精度控制
开发语言·lua
不染尘.7 分钟前
图的邻接矩阵实现以及遍历
开发语言·数据结构·vscode·算法·深度优先
国服第二切图仔10 分钟前
Rust开发之Trait作为参数与返回值使用
开发语言·后端·rust
码住懒羊羊15 分钟前
【C++】模板进阶 | 继承
android·java·c++
urkay-17 分钟前
Android 线程详解
android·java·kotlin·iphone·androidx
山峰哥17 分钟前
KingbaseES 表空间与模式优化策略深度研究报告
开发语言·数据结构·数据库·oracle·深度优先
小猪绝不放弃.19 分钟前
Spring Boot项目的核心依赖
java·spring boot·后端
yong999027 分钟前
C++语法—类的声明和定义
开发语言·c++·算法
狂奔的sherry29 分钟前
构造/析构/赋值运算理解
开发语言·c++