着色问题(2种颜色),其中每个顶点都有特定的区域并使用DFS查找最小的着色区域

时间:2019-04-19 08:20:52

标签: java graph-theory depth-first-search bipartite graph-coloring

我有一个岛屿/区域列表,最初是白色的。通过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;
    }

1 个答案:

答案 0 :(得分:0)

好的,DFS答案有效。

我只是意识到发生问题是因为我没有在所有边缘中添加,因为图形是无向的。如果我在列表中添加边缘2-> 3,则也需要添加3-> 2。