首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除图中找到链的最小顶点数

删除图中找到链的最小顶点数
EN

Stack Overflow用户
提问于 2020-06-25 16:43:21
回答 1查看 92关注 0票数 1

我有一个图(无向和不加权)和它的邻接矩阵(矩阵类型-布尔型)。我需要删除最小顶点数来找到这个图中的链。在过去的两天里,我一直在考虑如何做到这一点,但还没有做出任何决定,所以我请求你的帮助。

在我的头脑中,我对​​这个解决方案有一个粗略的想法,但我无法实现它。以下是我对这项任务的想法。

  1. 找到最长的链
  2. 为该链创建邻接矩阵
  3. 改变初始邻接矩阵

下面是我实现这个算法的尝试

代码语言:javascript
复制
    public void createChain() {
    int[][] maxMatrix = new int[adjMatrix.length][adjMatrix.length];
    Map<Integer, int[][]> curStr = new HashMap<>();
    Map<Integer, Map<Integer, int[][]>> maxStr = new HashMap<>();

    for (int i = 0; i < adjMatrix.length; i++) {
        for (int j = 0; j < adjMatrix.length; j++) {
            maxMatrix[i][j] = 0;
        }
    }
    createChain(maxMatrix, curStr, maxStr, 0);

    int maxKey = 0;
    for (int key : maxStr.keySet()) {
        if (key > maxKey) maxKey = key;
    }

    curStr = maxStr.get(maxKey);
    int maxKey1 = 0;
    for (int key : curStr.keySet()) {
        if (key > maxKey1) {
            maxKey1 = key;
        }
    }
    maxMatrix = curStr.get(maxKey1);

    for (int i = 0; i < maxMatrix.length; i++) {
        for (int j = 0; j < maxMatrix.length; j++) {
            adjMatrix[i][j] = maxMatrix[i][j] == 1;
        }
    }

}

private void createChain(int[][] matrix, Map<Integer, int[][]> curStr, Map<Integer, Map<Integer, int[][]>> maxStr, int i) {
    for (int j = i; j < matrix.length; j++) {
        if (adjMatrix[i][j]) {

            if (!curStr.containsKey(i)) {
                matrix[i][j] = 1;
                curStr.put(i, matrix);
                i = j;

                maxStr.put(curStr.size(), curStr);
                Map<Integer, int[][]> copyOfCurStr = new HashMap<>();
                for (Integer key : curStr.keySet()) {
                    copyOfCurStr.put(key, copyOfCurStr.get(key));
                }

                int[][] copyOfMatrix = new int[matrix.length][matrix.length];
                for (int k = 0; k < matrix.length; k++) {
                    for (int l = 0; l < matrix.length; l++) {
                        copyOfMatrix[i][j] = matrix[i][j];
                    }
                }
                createChain(copyOfMatrix, copyOfCurStr, maxStr, i);
            }
        }
    }
}

该程序适用于某些输入,但不适用于其他输入。例如:

  1. 输入输出.如你所见,一切正常
  2. 输入输出.该算法不能正常工作。输出应该是像这样
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-29 18:48:32

我想我找到了解决办法。基于一种改进的哈密顿路径搜索算法实现了该算法。

代码语言:javascript
复制
private boolean isSafe(int v, int graph[][], int path[], int pos) {
    if (graph[path[pos - 1]][v] == 0)
        return false;

    for (int i = 0; i < pos; i++)
        if (path[i] == v)
            return false;

    return true;
}


private void hamCycleUtil(int graph[][], int path[], int pos, List<int[]> paths) {
    if (pos >= adjMatrix.length) {
        return;
    }

    for (int v = 0; v < adjMatrix.length; v++) {
        if (isSafe(v, graph, path, pos)) {
            path[pos] = v;

            int[] copyOfPath = new int[adjMatrix.length];
            System.arraycopy(path, 0, copyOfPath, 0, adjMatrix.length);
            paths.add(copyOfPath);


            hamCycleUtil(graph, path, pos + 1, paths);

            path[pos] = -1;
        }
    }
}


public int createChain() {
    List<int[]> paths = new ArrayList<>();
    int[][] matrix = new int[adjMatrix.length][adjMatrix.length];
    for (int i = 0; i < adjMatrix.length; i++) {
        for (int j = 0; j < adjMatrix.length; j++) {
            if (adjMatrix[i][j]) matrix[i][j] = 1;
            else matrix[i][j] = 0;
        }
    }
    int[] path = new int[adjMatrix.length];
    Arrays.fill(path, -1);

    for (int i = 0; i < adjMatrix.length; i++) {
        path[0] = i;
        hamCycleUtil(matrix, path, 1, paths);
    }

    int[] maxPath = new int[adjMatrix.length];
    Arrays.fill(maxPath, -1);
    int quantityOfElems = 0;
    int maxPathLength = 0;
    for (int[] chain : paths) {
        for (int value : chain) {
            if (value == -1) {
                break;
            }
            quantityOfElems++;
        }
        for (int value : maxPath) {
            if (value == -1) {
                break;
            }
            maxPathLength++;
        }
        if (quantityOfElems >= maxPathLength) {
            maxPath = Arrays.copyOf(chain, chain.length);
        }
        maxPathLength = 0;
        quantityOfElems = 0;
    }

    /*
    for (int value : maxPath) {
        System.out.print(value + " ");
    }
    System.out.println();*/

    for (int i = 0; i < adjMatrix.length; i++) {
        for (int j = 0; j < adjMatrix.length; j++) {
            adjMatrix[i][j] = false;
        }
    }

    quantityOfElems = 0;
    for (int i = 0; i < maxPath.length - 1; i++) {
        if (maxPath[i] == -1 || maxPath[i + 1] == -1) break;
        adjMatrix[maxPath[i]][maxPath[i + 1]] = true;
        adjMatrix[maxPath[i + 1]][maxPath[i]] = true;
        quantityOfElems++;
    }

    return maxPath.length - quantityOfElems - 1;
}

示例:

  1. 输入输出
  2. 输入输出
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62580269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档