我有一个岛屿/区域列表,最初是白色的。通过1条边彼此连接的所有顶点必须具有相反的颜色。 (黑色或白色)。我希望使用最少的黑色为这些岛上色。 每个岛的大小都不同,岛的索引从1开始。
我使用了DFS和一个全局对象来跟踪白色和黑色区域,然后为我提供两者中的最小值。假设整个图未连接并且具有多个组件。我已经为每个新组件重置了全局变量。我没有得到正确的答案,也不知道我的逻辑错误在哪里。 (我很确定我的DFSrec方法是正确的)
// this will be the DFS spanning tree for 1 component
private void DFSrec(int v,
boolean[] visitedArr, int[] predecessorArr) {
visitedArr[v] = true;
if (islandsList.get(v).colour.equals("WHITE")) {
p.whiteArea += islandsList.get(v).area;
} else {
p.blackArea += islandsList.get(v).area;
}
for (int neighbour : adjList.get(v)) {
if (!visitedArr[neighbour]) {
predecessorArr[neighbour] = v;
if (islandsList.get(v).colour.equals("WHITE")) {
islandsList.get(neighbour).setColour("BLACK");
} else {
islandsList.get(neighbour).setColour("WHITE");
}
DFSrec(neighbour, visitedArr, predecessorArr);
}
}
}
// covers all components
private int DFS(boolean[] visitedArr, int[] predecessorArr, int numIslands){
int minArea = 0;
for (int v = 1; v <= numIslands; v++) {
if ( !visitedArr[v] ) {
DFSrec(v, visitedArr, predecessorArr);
int minAreaOfComponent = p.minArea();
minArea += minAreaOfComponent;
p = new Pair();
}
}
return minArea;
}
答案 0 :(得分:0)
好的,DFS答案有效。
我只是意识到发生问题是因为我没有在所有边缘中添加,因为图形是无向的。如果我在列表中添加边缘2-> 3,则也需要添加3-> 2。