void dfs(int n, int k) { COUNT = 0; M[0][0] = 0; dfs_sub(n, k, 0, 0); M[0][0] = 1; dfs_sub(n, k, 0, 0); if (PRINT_COUNTS_TOGGLE) printf("%llu ", COUNT); ALL_RESULTS[PATTERN_MASK].counts[n][k] = COUNT; ALL_RESULTS[PATTERN_MASK].pattern_mask = PATTERN_MASK; ALL_RESULTS[PATTERN_MASK].cannon_index = CANNONICAL_INDEX[PATTERN_MASK]; }
void dfs_sub(int n, int k, int n2, int k2) { if (!avoidsPartialPatterns(n, k, n2, k2)) return; if (k2 < (k - 1)) { k2++; M[n2][k2] = 0; dfs_sub(n, k, n2, k2); M[n2][k2] = 1; dfs_sub(n, k, n2, k2); } else { n2++; k2 = 0; if (n2 == n) { COUNT++; return; } M[n2][k2] = 0; dfs_sub(n, k, n2, k2); M[n2][k2] = 1; dfs_sub(n, k, n2, k2); return; } }
void pathfinder::dfs_sub (node& curr, node& father) { low_num[curr] = dfs_num[curr] = act_dfs_num++; new_nodes--; node::adj_edges_iterator it = curr.adj_edges_begin(); node::adj_edges_iterator end = curr.adj_edges_end(); while (it != end) { edge adj = *it; node opp = curr.opposite(adj); if (dfs_num[opp] == 0) { list<edge>::iterator tmp = tree[curr].insert (tree[curr].end(), adj); to_father[opp] = tmp; dfs_sub (opp, curr); if (low_num[opp] < low_num[curr]) { low_num[curr] = low_num[opp]; to_low[curr] = tmp; } if (low_num[opp] >= dfs_num[curr]) { is_biconn = false; } } else if (opp != father && dfs_num[opp] < dfs_num[curr]) { list<edge>::iterator back_pos = back[curr].insert (back[curr].end(), adj); list<edge>::iterator forward_pos = forward[opp].insert (forward[opp].end(), adj); pos[adj] = pos_pair (forward_pos, back_pos); if (dfs_num[opp] < low_num[curr]) { low_num[curr] = dfs_num[opp]; to_low[curr] = back_pos; } } ++it; } }
__GTL_BEGIN_NAMESPACE pathfinder::pathfinder (const graph& G, edge st, node s) { node t = s.opposite (st); dfs_num.init (G, 0); low_num.init (G); tree.init (G, list<edge>()); back.init (G, list<edge>()); forward.init (G, list<edge>()); // // There is a problem with node/edge maps of iterators with Visual C++ // which I don´t fully understand at the moment. Anyway the init for the // maps below is only needed to allocate memory, which is done anyway, when // values are assigned to it. // #ifndef __GTL_MSVCC to_low.init (G); to_father.init (G); pos.init (G); #endif used.init (G,0); act_dfs_num = 1; new_nodes = G.number_of_nodes(); is_biconn = true; // // Do DFS with biconnectivity extensions. // dfs_num[t] = act_dfs_num++; low_num[t] = dfs_num[t]; new_nodes--; dfs_sub (s, t); if (new_nodes != 0) { is_biconn = false; } used[t] = used[s] = 1; }