0

グラフにノードを追加および削除してから、BFS および DFS トラバーサルを実行できるプログラムを作成しようとしています。

ここに画像の説明を入力

だから私はもともと実行時addconnectノードを...次に、ユーザーがadd child to parentボタンを押して子を適切に追加できるようにしたいと考えています。

AddButton.addActionListener(new ActionListener() {   
        public void actionPerformed(ActionEvent e)
        {   
            Nodes nX = new Nodes("X", nodeX, nodeY, nodeWidth, nodeHeight);
            appendNode(rootNode, nX);
        }
   });  

}

X新しいノードを追加しようとすると、現在の隣接行列が上書きされ、 の子として単一の新しいノードに置き換えられるようですA

ここに画像の説明を入力

私はそれがなぜそれをしているのか知っていると思います...私のappendNode()関数は古いものを上書きし、新しいnodeListサイズで新しいものを作成することによって隣接行列を更新しようとするからです:

public void appendNode(Nodes parent, Nodes child) {
    //add new node X to nodeList
    addNode(child);

    //loop through all nodes again to be connected, plus new one... then create new adjMatrix
    System.out.println(nodeList.size());
    size = nodeList.size();

    adjMatrix = null;
    adjMatrix = new int[size][size];

    int fromNode = nodeList.indexOf(parent);
    int toNode = nodeList.indexOf(child);
    adjMatrix[fromNode][toNode] = 1;
    adjMatrix[toNode][fromNode] = 0;

}

public void addNode(Nodes n) {
    nodeList.add(n);
}

しかし、上書きせずに欲しいものを達成する他の方法はわかりません。

何かご意見は?

ありがとう!


参考までに、接続ノード メソッドは次のとおりです。

public void connectNode(Nodes from, Nodes to)
{
    //if matrix is empty..
    if(adjMatrix == null)
    {
        //set matrix [row][col] size to size of nodesList list
        size = nodeList.size();
        //set dimensions of adj matrix... (6x6 nodesList)

        adjMatrix = new int[size][size];
    }

    int fromNode = nodeList.indexOf(from);
    int toNode = nodeList.indexOf(to);

    //connect node A to B and B to A, set that i,j position = 1
    adjMatrix[fromNode][toNode] = 1;
    adjMatrix[toNode][fromNode] = 0;

}

編集:

public void appendNode(Nodes parent, Nodes child) {
    //add new node X to nodeList
    addNode(child);

    //loop through all nodes again to be connected, plus new one... then create new adjMatrix
    int newSize = nodeList.size();

    //make a new adj matrix of the new size...
    int[][] adjMatrixCopy = new int[newSize][newSize];

    int fromNode = nodeList.indexOf(parent);
    int toNode = nodeList.indexOf(child);
    adjMatrixCopy[fromNode][toNode] = 1;
    adjMatrixCopy[toNode][fromNode] = 0;


    //copy adjMatrix data to new matrix...
    for (int i = 0; i < adjMatrix.length; i++) {    
        for (int j = 0; j < adjMatrix[i].length; j++) {
            adjMatrixCopy[i][j] = adjMatrix[i][j];
        }
    }

    //still need to add newly added node 

    //adjMatrix = null;
}
4

2 に答える 2

2

隣接行列を空白にして、更新されたサイズの新しい行列に置き換えると、(from, to) と (to, from) を除くすべてのセルがゼロになります。新しいサイズで新しい隣接行列を作成し、古いものからデータをコピーしてから、古いものを上書きする必要があります。

于 2013-06-20T21:40:24.483 に答える
0

隣接リストではないのはなぜですか?または、その場でインクリメントできるコレクションを使用した隣接行列ですか?

配列を使用すると、この長年の問題につながると思います。隣接行列を使用する場合は、コレクションを使用する必要があります。とはいえ、BFS を実行しているだけなら、隣接リストの方が高速に動作するので、それをお勧めします。

于 2013-06-21T06:44:13.827 に答える