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); }
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); } }
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; }