Пример #1
0
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];
}
Пример #2
0
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;
  }
}
Пример #3
0
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;
    }
}
Пример #4
0
__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;
}