邻接矩阵删除顶点

时间:2018-03-28 00:45:51

标签: java algorithm graph adjacency-matrix

我正在尝试在Java中实现邻接矩阵。

我使用ArrayList存储作为字母标签的顶点。我在ArrayList中基于顶点索引构建矩阵。

让我们说无向图是

A-B

将A,B存储在数组列表中。

矩阵应该是

[[false,true],[true,false]]

请问我应该怎么做才能删除顶点?

目前,我从顶点移除了所有边缘,下一步,我有2个想法

  1. 基于顶点索引在ArrayList中将值设置为null。
  2. 根据索引从ArrayList中删除顶点,然后更改2d矩阵布尔数组。如果是这样,我应该在那里更改什么,删除行和列?
  3. 是的,我会实现bfs或一些函数,比如计算2个顶点之间的短路径。

    感谢您提供的任何建议和任何学习资源。

    这是我的代码:

        public class AdjMatrix <T extends Object>
        {
            // List to store all vertexs
            private ArrayList<T> vertList;
    
            // graph in 2d array
            private boolean[][] adjMatrix;
    
            public AdjMatrix() {
                vertList = new ArrayList<T>();
                adjMatrix = new boolean[4000][4000];
            } 
    
            public void addVertex(T vertLabel) {
                vertList.add(vertLabel);
            } 
    
            public void addEdge(T srcLabel, T tarLabel) {
                int srcIndex = vertList.indexOf(srcLabel);
                int tarIndex = vertList.indexOf(tarLabel);
                adjMatrix[srcIndex][tarIndex] = true;
                adjMatrix[tarIndex][srcIndex] = true;
            } 
    
            public ArrayList<T> neighbours(T vertLabel) {
    
                ArrayList<T> neighbours = new ArrayList<T>();
                int vertIndex = vertList.indexOf(vertLabel);
                int[] vertEdges = adjMatrix[vertIndex];
                for(int i = 0; i < vertEdges.length; i++){
                    if(vertEdges[i]){
                        neighbours.add(vertList.get(i));
                    }
                }
                return neighbours;
            } 
    
            public void removeVertex(T vertLabel) {
                // what should I do there?
                ArrayList<T> neighbours = neighbours(vertLabel);
                for (T neighbour: neighbours
                     ) {
                    removeEdge(vertLabel,neighbour);
                }
            }
    
            public void removeEdge(T srcLabel, T tarLabel) {
                int srcIndex = vertList.indexOf(srcLabel);
                int tarIndex = vertList.indexOf(tarLabel);
                adjMatrix[srcIndex][tarIndex] = false;
                adjMatrix[tarIndex][srcIndex] = false;       
            } 
    
            public void printVertices(PrintWriter os) {
                String result = "";
                for (T vert :
                        vertList) {
                    result += vert + " ";
                }
                os.println(result);
            } 
    
            public void printEdges(PrintWriter os) {
                for (T vert :
                        vertList) {
                    ArrayList<T> neighbours = neighbours(vert);
                    for (T neighbour :
                            neighbours) {
                        os.println(vert + " " + neighbour);
                    }
                }
            }
        }
    

1 个答案:

答案 0 :(得分:1)

你是什么意思&#39;删除&#39;?

如果您确实要删除 - 删除,只需删除已删除节点的行和列,然后重新编号其余节点。