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

[复制链接]
发表于 2025-10-17 17:14:39 | 显示全部楼层 |阅读模式
  1. package algorithm;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import java.util.Locale;
  6. public class GraphByAdjacencyMatrix {
  7.     private final List<Integer> mVertex = new ArrayList<>();
  8.     private final List<List<Integer>> mAdjMatrix = new ArrayList<>();
  9.     /**
  10.      * 初始化图
  11.      *
  12.      * @param vertex 顶点列表
  13.      * @param edges 相邻顶点关系(边)
  14.      */
  15.     public void init(List<Integer> vertex, List<int[]> edges) {
  16.         mVertex.addAll(vertex);
  17.         int size = size();
  18.         for (int i = 0; i < size; i++) {
  19.             List<Integer> col = new ArrayList<>();
  20.             for (int j = 0; j < size; j++) {
  21.                 col.add(0);
  22.             }
  23.             mAdjMatrix.add(col);
  24.         }
  25.         for (int i = 0; i < edges.size(); i++) {
  26.             int[] edge = edges.get(i);
  27.             checkEdgeValid(edge, i);
  28.             mAdjMatrix.get(edge[0]).set(edge[1], 1);
  29.             mAdjMatrix.get(edge[1]).set(edge[0], 1);
  30.         }
  31.     }
  32.     /**
  33.      * 添加顶点
  34.      *
  35.      * @param val 顶点值
  36.      */
  37.     public void addVertex(int val) {
  38.         List<Integer> row = new ArrayList<>();
  39.         for (int j = 0; j < size(); j++) {
  40.             row.add(0);
  41.         }
  42.         mVertex.add(val);
  43.         mAdjMatrix.add(row);
  44.         for (List<Integer> col : mAdjMatrix) {
  45.             col.add(0);
  46.         }
  47.     }
  48.     /**
  49.      * 删除顶点
  50.      *
  51.      * @param val 顶点值
  52.      */
  53.     public void deleteVertex(int val) {
  54.         int index = mVertex.indexOf(val);
  55.         if (index == -1) {
  56.             System.out.println("can't delete a Non-existent vertices");
  57.             return;
  58.         }
  59.         mVertex.remove(index);
  60.         mAdjMatrix.remove(index);
  61.         for (List<Integer> row : mAdjMatrix) {
  62.             row.remove(index);
  63.         }
  64.     }
  65.     /**
  66.      * 添加相邻顶点关系(边)
  67.      *
  68.      * @param edge 边
  69.      */
  70.     public void addEdge(int[] edge) {
  71.         checkEdgeValid(edge, -1);
  72.         mAdjMatrix.get(edge[0]).set(edge[1], 1);
  73.         mAdjMatrix.get(edge[1]).set(edge[0], 1);
  74.     }
  75.     /**
  76.      * 删除相邻顶点关系(边)
  77.      *
  78.      * @param edge 边
  79.      */
  80.     public void deleteEdge(int[] edge) {
  81.         checkEdgeValid(edge, -1);
  82.         mAdjMatrix.get(edge[0]).set(edge[1], 0);
  83.         mAdjMatrix.get(edge[1]).set(edge[0], 0);
  84.     }
  85.     public void print() {
  86.         System.out.println("\n------------------print graph-------------------");
  87.         System.out.printf(Locale.ENGLISH, "\n\t%s%s%n",
  88.                 " ".repeat(4), getArrayPrintString(mVertex, " ", "  ", " "));
  89.         System.out.printf(Locale.ENGLISH, "\n");
  90.         for (int i = 0; i < mAdjMatrix.size(); i++) {
  91.             List<Integer> row = mAdjMatrix.get(i);
  92.             Integer vertex = mVertex.get(i);
  93.             System.out.printf(Locale.ENGLISH, "\t%s%s%n", String.format("%3d:", vertex),
  94.                     getArrayPrintString(row, "[", ", ", "]"));
  95.         }
  96.     }
  97.     private String getArrayPrintString(List<Integer> array, String symbolLeft, String symbolMid, String symbolRight) {
  98.         StringBuilder sb = new StringBuilder(symbolLeft);
  99.         for (int i = 0; i < array.size(); i++) {
  100.             sb.append(String.format("%3d", array.get(i)));
  101.             if (i < array.size() - 1)
  102.                 sb.append(symbolMid);
  103.         }
  104.         sb.append(symbolRight);
  105.         return sb.toString();
  106.     }
  107.     private void checkEdgeValid(int[] edge, int indexAtEdges) {
  108.         if (edge.length != 2) {
  109.             String errMessage = indexAtEdges != -1 ? String.format(Locale.ENGLISH,
  110.                     "invalid edge at edges[%s]!", indexAtEdges) : "invalid edge!";
  111.             throw new IllegalArgumentException(errMessage);
  112.         }
  113.         int indexOfVertex1 = edge[0];
  114.         int indexOfVertex2 = edge[1];
  115.         if (indexOfVertex1 >= size() || indexOfVertex2 >= size() || indexOfVertex1 == indexOfVertex2) {
  116.             throw new IllegalArgumentException(String.format(Locale.ENGLISH,
  117.                     "invalid edge:[%s,%s]", indexOfVertex1, indexOfVertex2));
  118.         }
  119.     }
  120.     private int size() {
  121.         return mVertex.size();
  122.     }
  123.     public static void main(String[] args) {
  124.         GraphByAdjacencyMatrix graph = new GraphByAdjacencyMatrix();
  125.         List<Integer> vertex = new ArrayList<>();
  126.         vertex.add(23);
  127.         vertex.add(11);
  128.         vertex.add(54);
  129.         vertex.add(6);
  130.         vertex.add(16);
  131.         vertex.add(32);
  132.         vertex.add(41);
  133.         List<int[]> edges = new ArrayList<>();
  134.         edges.add(new int[]{0, 1});
  135.         edges.add(new int[]{0, 4});
  136.         edges.add(new int[]{0, 3});
  137.         edges.add(new int[]{1, 4});
  138.         edges.add(new int[]{1, 2});
  139.         edges.add(new int[]{1, 6});
  140.         edges.add(new int[]{2, 6});
  141.         edges.add(new int[]{3, 5});
  142.         edges.add(new int[]{4, 5});
  143.         edges.add(new int[]{5, 6});
  144.         graph.init(vertex, edges);
  145.         System.out.println("\n\ninitiate graph");
  146.         graph.print();
  147.         graph.addVertex(89);
  148.         System.out.println("\n\nafter add vertex 89");
  149.         graph.print();
  150.         graph.addEdge(new int[]{5,7});
  151.         graph.addEdge(new int[]{6,7});
  152.         System.out.println("\n\nafter add edge [5,7],[6,7]");
  153.         graph.print();
  154.         graph.deleteVertex(16);
  155.         System.out.println("\n\nafter delete vertex 16");
  156.         graph.print();
  157.         graph.addEdge(new int[]{1,5});
  158.         graph.addEdge(new int[]{4,5});
  159.         System.out.println("\n\nafter delete edge [1,5],[4,5]");
  160.         graph.print();
  161.     }
  162. }
复制代码





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表