首页 文章

邻接矩阵删除顶点

提问于
浏览
0

我试图在Java中实现邻接矩阵 .

我使用ArrayList存储顶点,这是一个字母标签 . 我在ArrayList中基于顶点索引构建矩阵 .

让我们说无向图是

A-B

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

矩阵应该是

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

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

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

  • 基于顶点索引在ArrayList中将值设置为null .

  • 根据索引从ArrayList中删除顶点,然后更改2d矩阵布尔数组 . 如果是这样,我应该在那里更改什么,删除行和列?

是的,我将实现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 回答

  • 1

    你是什么意思'删除'?

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

相关问题