#java #graph
#java #График
Вопрос:
Когда я запускаю свой приведенный ниже код, я продолжаю получать ошибку из заголовка этого сообщения, хотя я не знаю почему. Я попытался: Arrays.fill(marked, false);
, я пытаюсь выяснить, сколько белых узлов и черных узлов подключаются, которые не существуют в blacknodes[]
.
public class BlackWhite {
private static boolean[] marked;
public BlackWhite(Graph G, int s) {
marked = new boolean[G.V()];
dfs(G, s);
}
public static int count(Graph G, int[] blacknodes) {
int rw_count = 0;
for (int w : G.adj(blacknodes.length)) {
if (marked(w)) {
rw_count ;
}
}
return rw_count;
}
private void dfs(Graph G, int v) {
marked[v] = true;
for (int w : G.adj(v)) {
if (!marked[w]) {
dfs(G, w);
}
}
}
public static boolean marked(int v) {
return marked[v];
}
public static void main(String[] args) {
Graph G = new Graph(3);
G.addEdge(1, 2);
G.addEdge(4, 1);
G.addEdge(1, 8);
System.out.println(BlackWhite.count(G, new int[] { 1 })); // should print 3
}
}
Ответ №1:
Вы инициализируете marked
массив в конструкторе BlackWhite
класса. Но в вашем основном методе вы никогда не вызывали new BlackWhite()
. Таким образом, ваш marked
массив по-прежнему равен null при вызове статического count
метода.
Вы должны изменить свой метод подсчета следующим образом.
public static int count(Graph G, int[] blacknodes) {
int rw_count = 0;
if(marked == null) marked = new boolean[G.V()];
for (int w : G.adj(blacknodes.length)) {
if (marked(w)) {
rw_count ;
}
}
return rw_count;
}
Комментарии:
1. Спасибо. Как я могу использовать DSF? Как я могу сравнить с входным массивом?
2. Вы можете удалить static из метода count и использовать BlackWhite blackwhite = new BlackWhite() ; а затем BlackWhite.count(G, new int[] { 1 })); это должно вызвать конструктор и запустить dfs на вашем графике.