private static void growSeedAdd(Cluster cluster,
			Map<String, ArrayList<String>> adjList, Set<String> seedsToProcess) {

		List<String> borderMembList = ClusterServices.getBordMemb(adjList,
				cluster);
		Queue<String> nodesToTryBorder = new LinkedList<>();
		nodesToTryBorder.addAll(borderMembList);
		while (!nodesToTryBorder.isEmpty()) {
			String currBorderNode = nodesToTryBorder.poll();
			if (currBorderNode == null) {
				break;
			}
			List<String> outNodes = NodeService.getBordChildren(cluster,
					adjList.get(currBorderNode));
			Queue<String> bordNodeOutChildren = new LinkedList<>();
			bordNodeOutChildren.addAll(outNodes);

			while (!bordNodeOutChildren.isEmpty()) {
				String nodeToAdd = bordNodeOutChildren.poll();
				if (currBorderNode == null) {
					break;
				}
				/**
				 * Add vertex and recompute entropy if decreased keep vertex
				 */
				cluster.addMember(nodeToAdd);
				borderMembList = ClusterServices.getBordMemb(adjList, cluster);
				Double entropy = computeEntropyGraph(cluster, adjList,
						borderMembList);

				if (entropy < cluster.getEntropy()) {
					cluster.setEntropy(entropy); // update cluster entropy
					/**
					 * Add another border node When adding new vertex to the
					 * cluster, check if it is already a seed first.
					 */
					if (seedsToProcess.contains(nodeToAdd)) {
						/**
						 * Remove the seed for the current compute cluster from
						 * the seeds to process, so that other clusters can grow
						 * into this cluster.
						 */
						seedsToProcess.remove(cluster.seed);
						/**
						 * Clear the cluster, so that it members could be seed
						 * candidates for the next iteration.
						 */
						cluster.getAllMembers().clear();
						/**
						 * Terminate cluster computation for this seed.
						 */
						return;
					}
					nodesToTryBorder.offer(nodeToAdd);
				} else {
					cluster.getAllMembers().remove(nodeToAdd);
				}
			}
		}
	}