/** * Removes the vertex and its edges from the graph. * * The vertex is removed from the Vertices array by moving all the * vertices that come after it one place to the left. * * The algorithm that removes the edge is illustrated below. Assume * that the adjacency matrix is (this comments assumes that adjacency * matrix is used, but using adjacency list or any other data structure * to store the edges doesn't affect the algorithm presented here): * * A B C D E * A aa ab ac ad ae * B ba bb bc bd be * C ca cb cc cd ce * D da db dc dd de * E ea eb ec ed ee * * where A, B, C, D, E are the vertices. If we're to remove the vertex * C from the graph, the adjacency matrix transforms into: * * A B D E * A aa ab ad ae * B ba bb bd be * D da db dd de * E ea eb ed ee * * The algorithm to remove the edges from/to a given vertex can be split * in two steps: * * 1) The first step handles the edges in the rows above the row to which * the vertex to be removed belongs to. Note that these edges (such as * 'ad' or 'be') only need to be copied one column to the left. There's * no need to change their row in the matrix. The psedo algorithm for * this step is: * * for (i = 0; i < indexof(vertex_to_delete); ++i) * for (j = indexof(vertex_to_delete) + 1; j < Size; ++j) * AdjacencyMatrix(i, j - 1) = AdjacencyMatrix(i, j) * * where Size is the number of vertices in the graph (including the * vertex to be removed. This step removes all the edges 'to' the vertex * that is being removed. * * 2) The second step handles the edges in the rows below the row to which * the vertex to be removed belongs to. Note that edges in the columns * left to the column to which the deleting vertex belongs to (such as 'da' * or 'eb') only need to be moved one row up. On the other hand, edges in * the columns right to the column to which the deleting vertex belongs to * (such as 'dd' or 'ee') must be moved one row up and one column to the * left. The psedo code for this is: * * for (i = indexof(vertex_to_delete) + 1; i < Size; ++i) * for (j = 0; j < Size; ++j) * if (j < indexof(vertex_to_delete)) * AdjacencyMatrix(i - 1, j) = AdjacencyMatrix(i, j) * else if (j > indexof(vertex_to_delete)) * AdjacencyMatrix(i - 1, j - 1) = AdjacencyMatrix(i, j) * * This step removes all the edges 'from' the deleting vertex. * * @param vertex_index The index of the vertex to remove. */ private void RemoveVertexInternal(int vertex_index) { // Remove the vertex from the Vertices array for (int i = vertex_index + 1; i < Size; ++i) { Vertices[i - 1] = Vertices[i]; } // Remove the edges 'to' the vertex by moving all the edges in // the columns right to the column to which this vertex belongs // one column to the left. for (int i = 0; i < vertex_index; ++i) { for (int j = vertex_index + 1; j < Size; ++j) { Edges.SetEdge(i, j - 1, Edges.GetEdge(i, j)); } } // Remove the edges 'from' the vertex by moving all the edges in // the rows below the row to which this vertex belongs one row // up and potentially one column to the left. for (int i = vertex_index + 1; i < Size; ++i) { for (int j = 0; j < Size; ++j) { if (j <= vertex_index) { // The edges in the columns left to the column to which // the deleting vertex belongs to only need to be moved // one row up Edges.SetEdge(i - 1, j, Edges.GetEdge(i, j)); } else { // The edges in the columns right to the column to which // the deleting vertex belongs to also need to be moved // one column to the left. Edges.SetEdge(i - 1, j - 1, Edges.GetEdge(i, j)); } } } // Decrese the graph size --Size; }