图的代码实现(以邻接矩阵表示)

java 复制代码
package algorithm;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

public class GraphByAdjacencyMatrix {
    private final List<Integer> mVertex = new ArrayList<>();
    private final List<List<Integer>> mAdjMatrix = new ArrayList<>();

    /**
     * 初始化图
     *
     * @param vertex 顶点列表
     * @param edges 相邻顶点关系(边)
     */
    public void init(List<Integer> vertex, List<int[]> edges) {
        mVertex.addAll(vertex);
        int size = size();
        for (int i = 0; i < size; i++) {
            List<Integer> col = new ArrayList<>();
            for (int j = 0; j < size; j++) {
                col.add(0);
            }
            mAdjMatrix.add(col);
        }
        for (int i = 0; i < edges.size(); i++) {
            int[] edge = edges.get(i);
            checkEdgeValid(edge, i);
            mAdjMatrix.get(edge[0]).set(edge[1], 1);
            mAdjMatrix.get(edge[1]).set(edge[0], 1);
        }
    }

    /**
     * 添加顶点
     *
     * @param val 顶点值
     */
    public void addVertex(int val) {
        List<Integer> row = new ArrayList<>();
        for (int j = 0; j < size(); j++) {
            row.add(0);
        }
        mVertex.add(val);
        mAdjMatrix.add(row);
        for (List<Integer> col : mAdjMatrix) {
            col.add(0);
        }
    }

    /**
     * 删除顶点
     *
     * @param val 顶点值
     */
    public void deleteVertex(int val) {
        int index = mVertex.indexOf(val);
        if (index == -1) {
            System.out.println("can't delete a Non-existent vertices");
            return;
        }
        mVertex.remove(index);
        mAdjMatrix.remove(index);
        for (List<Integer> row : mAdjMatrix) {
            row.remove(index);
        }
    }

    /**
     * 添加相邻顶点关系(边)
     *
     * @param edge 边
     */
    public void addEdge(int[] edge) {
        checkEdgeValid(edge, -1);
        mAdjMatrix.get(edge[0]).set(edge[1], 1);
        mAdjMatrix.get(edge[1]).set(edge[0], 1);
    }

    /**
     * 删除相邻顶点关系(边)
     *
     * @param edge 边
     */
    public void deleteEdge(int[] edge) {
        checkEdgeValid(edge, -1);
        mAdjMatrix.get(edge[0]).set(edge[1], 0);
        mAdjMatrix.get(edge[1]).set(edge[0], 0);
    }

    public void print() {
        System.out.println("\n------------------print graph-------------------");
        System.out.printf(Locale.ENGLISH, "\n\t%s%s%n",
                " ".repeat(4), getArrayPrintString(mVertex, " ", "  ", " "));
        System.out.printf(Locale.ENGLISH, "\n");
        for (int i = 0; i < mAdjMatrix.size(); i++) {
            List<Integer> row = mAdjMatrix.get(i);
            Integer vertex = mVertex.get(i);
            System.out.printf(Locale.ENGLISH, "\t%s%s%n", String.format("%3d:", vertex),
                    getArrayPrintString(row, "[", ", ", "]"));
        }
    }

    private String getArrayPrintString(List<Integer> array, String symbolLeft, String symbolMid, String symbolRight) {
        StringBuilder sb = new StringBuilder(symbolLeft);
        for (int i = 0; i < array.size(); i++) {
            sb.append(String.format("%3d", array.get(i)));
            if (i < array.size() - 1)
                sb.append(symbolMid);
        }
        sb.append(symbolRight);
        return sb.toString();
    }

    private void checkEdgeValid(int[] edge, int indexAtEdges) {
        if (edge.length != 2) {
            String errMessage = indexAtEdges != -1 ? String.format(Locale.ENGLISH,
                    "invalid edge at edges[%s]!", indexAtEdges) : "invalid edge!";
            throw new IllegalArgumentException(errMessage);
        }
        int indexOfVertex1 = edge[0];
        int indexOfVertex2 = edge[1];
        if (indexOfVertex1 >= size() || indexOfVertex2 >= size() || indexOfVertex1 == indexOfVertex2) {
            throw new IllegalArgumentException(String.format(Locale.ENGLISH,
                    "invalid edge:[%s,%s]", indexOfVertex1, indexOfVertex2));
        }
    }

    private int size() {
        return mVertex.size();
    }

    public static void main(String[] args) {
        GraphByAdjacencyMatrix graph = new GraphByAdjacencyMatrix();
        List<Integer> vertex = new ArrayList<>();
        vertex.add(23);
        vertex.add(11);
        vertex.add(54);
        vertex.add(6);
        vertex.add(16);
        vertex.add(32);
        vertex.add(41);
        List<int[]> edges = new ArrayList<>();
        edges.add(new int[]{0, 1});
        edges.add(new int[]{0, 4});
        edges.add(new int[]{0, 3});
        edges.add(new int[]{1, 4});
        edges.add(new int[]{1, 2});
        edges.add(new int[]{1, 6});
        edges.add(new int[]{2, 6});
        edges.add(new int[]{3, 5});
        edges.add(new int[]{4, 5});
        edges.add(new int[]{5, 6});
        graph.init(vertex, edges);
        System.out.println("\n\ninitiate graph");
        graph.print();

        graph.addVertex(89);
        System.out.println("\n\nafter add vertex 89");
        graph.print();

        graph.addEdge(new int[]{5,7});
        graph.addEdge(new int[]{6,7});
        System.out.println("\n\nafter add edge [5,7],[6,7]");
        graph.print();

        graph.deleteVertex(16);
        System.out.println("\n\nafter delete vertex 16");
        graph.print();

        graph.addEdge(new int[]{1,5});
        graph.addEdge(new int[]{4,5});
        System.out.println("\n\nafter delete edge [1,5],[4,5]");
        graph.print();
    }
}

相关推荐
黎雁·泠崖3 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
代码游侠3 小时前
C语言核心概念复习——网络协议与TCP/IP
linux·运维·服务器·网络·算法
2301_763472463 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
qq_12498707534 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_4 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.4 小时前
Day06——权限认证-项目集成
java
瑶山4 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy4 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
2301_818732064 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
园小异4 小时前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展