Пример #1
0
bool nextSession(int j)
{
	int startS = session[j][0];
	int startT = session[j][1]+1;
	if (startS < 0) {
		startS = (j==0)? 0:session[j-1][0]+1;
		startT = startS + 1;
	}else {
		sessionMark[startS] = sessionMark[startT-1] = 0;
	}
	for (int u=startS; u<n; u++) if (sessionMark[u]==0) {
		int temp = (u==startS)? startT:u+1;
		for (int v = temp; v<n; v++) if (sessionMark[v]==0 && map[u][v]>1) {
			session[j][0] = u;
			session[j][1] = v;
			sessionMark[u] = sessionMark[v] = 1;
			if (j==k-1) return true;
			else {
				j++;
				session[j][0] = -1;
				return nextSession(j);
			}
		}
	}
	if (j==0) return false;
	return nextSession(j-1);
}
Пример #2
0
void check_graph(sparsegraph * sg)
{
	n = sg->nv;
	for (int i=0; i<n; i++)
		for (int j=0; j<n; j++)
			map[i][j] = 0;
	for (int i=0; i<n; i++) {
		for (int j=0; j<sg->d[i]; j++) {
			int ii = sg->e[sg->v[i]+j];
			map[i][ii] = 1;
		}
	}
	for (int k=0; k<n; k++)
		for (int i=0; i<n; i++)
			for (int j=0; j<n; j++) {
				if (i==j || k==j || i==k) continue;
				if (map[i][k] == 0 || map[k][j] == 0) continue;
				if (map[i][j] > 0 && map[i][j] <= map[i][k] + map[k][j]) continue;
				map[i][j] = map[i][k] + map[k][j];
			}
	initSessionEnu();
	bool firstSearch = true;
	while (nextSession(firstSearch? 0:k-1)) {
		firstSearch = false;
		if (no_orth_cut(sg)) 
			second_check(sg);
	}
}
Пример #3
0
bool SessionInfoProcessor::next()
{
	bool result = false;
	if (key.empty()) {
		result = nextSession();
	} else {
		++propertyIt;
		if (propertyIt == filter->getDim(1)->end()) {
			result = nextSession();
		} else {
			key[1] = *propertyIt;
			result = true;
		}
	}
	return result;
}