public static void computeOneleapData(String file) throws IOException {
		readInOneLeapData(file);
		long t1 = System.currentTimeMillis();
		// 排序后，每个reduce只处理对应节点
		for (Integer current : nodeSet) {
			// if (pick.contains(nodeSet.get(i)))
			if (current % reduceNumber == 0) {
			//if (true) {
				stack.clear();
				// 构造起始状态，获得备选节点列表和度数列表
				// 此时res为T(+),candidate+res为Tx,candidate为T(-)
				HashMap<Integer, Integer> tmpres = new HashMap<Integer, Integer>();
				tmpres.put(current, 0);
				ArrayList<Pair> tmpcand = new ArrayList<Pair>();
				HashMap<Integer, Integer> tmpnot = new HashMap<Integer, Integer>();
				// 初始化备选集并按度数排序
				//initialSGraph(tmpcand, tmpnot, current);
				getCandidate2(tmpcand,tmpnot,current);
				SubGraph initsub = new SubGraph();
				initsub.setCandidate(tmpcand);
				initsub.setNot(tmpnot);
				initsub.setResult(tmpres);
				stack.add(initsub);
				// "备选集"的概念和kplexold不同，此处备选集包含“两跳”节点，是待分解的原始图
				// 若“原始图”大小>=有意义的kplex大小时才进行计算
				// 若只计算某个节点最大的k-plex时，需再加判断条件
				while (!stack.isEmpty()) {
					SubGraph top = stack.pop();
					HashMap<Integer, Integer> res = top.getResult();
					ArrayList<Pair> candidate = top.getCandidate();
					HashMap<Integer, Integer> not = top.getNot();
					//这里保证了candidate中的所有点都满足条件2:在临界点邻接表内
					candidate = filterCandidate(res, candidate, not);
					Collections.sort(candidate);
					while (res.size() + candidate.size() >= quasiCliqueSize) {
						if (candidate.isEmpty()) {
							if (not.isEmpty()) {
								String r = res.keySet().toString();
								System.out.println(r.substring(1,
										r.length() - 1));
								cliquenum++;
							} else {
								dupnum++;
							}
							break;
						}
//						if (judgeKplex2(res, candidate, critnodes))// 是kplex
//						{
//							if (duplicate(not, res, candidate, critnodes)) {
//								dupnum++;
//								break;
//							}
//							// 是clique输出
//							String r = res.keySet().toString();
//							String c = candidate.toString();
//							System.out.println(r.toString().substring(1,
//									r.length() - 1)
//									+ ", " + c.substring(1, c.length() - 1));
//							break;
//						} else {
							Pair y = candidate.get(candidate.size() - 1);// 其他节点，存在策略
							candidate.remove(candidate.size() - 1);
							// 子图包含y
							// res中多了y
							HashMap<Integer, Integer> resA = (HashMap<Integer, Integer>) res
									.clone();
							HashSet<Integer> adj = oneLeap.get(y.point);
							for (Entry<Integer, Integer> en : resA.entrySet()) {
								if (!adj.contains(en.getKey())) {
									en.setValue(en.getValue() + 1);
								}
							}
							resA.put(y.point, y.discon);
//							// 分裂点y从候选点中删除后,需要更新候选集中点的度数值
//							// 这一段正好可以找出度数最小的点
//							for (Pair p : candidate) {
//								if (!adj.contains(p.point)) {
//									p.deg--;// y加到结果集后,这个点和当前candidate的不相邻点应减1
//								}
//							}
							ArrayList<Pair> canA = new ArrayList<Pair>();
							HashMap<Integer, Integer> notA = new HashMap<Integer, Integer>();
							getT2(canA, notA, y.point, candidate, not);
							SubGraph sA = new SubGraph();
							sA.setCandidate(canA);
							sA.setResult(resA);
							sA.setNot(notA);
							stack.add(sA);

							
							not.put(y.point, y.discon);
//						}
					}
				}
			}
		}
		long t2 = System.currentTimeMillis();
		System.out.println("========" + (t2 - t1) / 1000+ " hit:"+hit);
	}