public void clear(int v) {
		// Remove v from the list of vertices
		if (startVertex == v) {
			startVertex = vertices[v];
		} else {
			int i = startVertex;
			while (vertices[i] != v) {
				i = vertices[i];
				if (i == -1) {
					return;
				}
			}
			vertices[i] = vertices[v];
		}
		vertices[v] = -1;
		numVertices--;

		// first delete the edges that don't start at you
		// Now delete the columns
		for (int i = 0; i < domainSize; i++) {
			int num = numEdges(i, v);
			if (num != 0) {
				numEdges -= num;
				numMultiEdges -= (num - 1);
				setValue(i, v, 0);
			}
		}

		// Now, clear all edges involving v
		// first the row This is done long ways as this might be faster as it
		// can write an int at a time
		long startBit = domainSize * CELL_SIZE * v;
		long endBit = domainSize * CELL_SIZE * (v + 1);

		int startInt = (int) (startBit / 32);
		int endInt = (int) (endBit / 32);
		int endIndex = (int) (endBit % 32);
		int startIndex = (int) (startBit % 32);

		if (startInt == endInt) {
			// If the whole row is contain within the current int
			int m = 0xFFFFFFFF << (domainSize * CELL_SIZE);
			m |= (1 << startIndex) - 1;
			edges[startInt] &= m;
		} else {
			// clear the starting int
			if (startIndex != 0) {
				// Need to only clear the END of the starting int
				int m = (1 << startIndex) - 1;
				edges[startInt] &= m;
				startInt++;
			}
			while (startInt < endInt) {
				edges[startInt++] = 0;
			}
			// Clear as much of the last index as needed
			if (endIndex != 0) {
				int m = 0xFFFFFFFF << endIndex;
				edges[endInt] &= m;
			}

		}

	}