【发布时间】:2020-06-25 16:43:21
【问题描述】:
我有一个图(非有向图和非加权图)及其邻接矩阵(矩阵类型 - 布尔值)。我需要删除最小数量的顶点才能在此图中找到链。 这两天我一直在想怎么做,还没有做出任何决定,所以请你帮忙。
在我的脑海中我有一个解决方案的粗略想法,但我无法实现它。 以下是我对这项任务的看法。
- 找到最长的链
- 为此链创建邻接矩阵
- 更改初始邻接矩阵
这是我实现这个算法的尝试
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);
}
}
}
}
该程序适用于某些输入,但不适用于其他输入。 例如:
【问题讨论】:
-
什么是“链”?
-
@amit 图中的链是使用边从一个顶点到另一个顶点的一系列顶点。链的长度是使用的边数,或使用的顶点数减一。一个简单的链不能两次访问同一个顶点。算法的结果应该是一个简单的链
-
感谢您的澄清。这方面的术语是path。您要解决的问题似乎是Hamiltonian Path Problem 的变体
-
@amit 感谢您的帮助
标签: java algorithm matrix graph