예제 #1
0
파일: allabc.cpp 프로젝트: Malows/aedcode
void comb(list_t &L,traverse_tree_fun f,void *data=NULL) {
  if (L.size()==1) {
    f(*L.begin(),data);
    return;
  } 
  int n=L.size();
  for (int j=0; j<n-1; j++) {
    for (int k=j+1; k<n; k++) {
      btree_t T;
      T.insert(T.begin(),-1);
      node_t m = T.begin();

      pos_t pk=L.begin();
      for (int kk=0; kk<k; kk++) pk++;
      T.splice(m.left(),pk->begin());
      L.erase(pk);

      pos_t pj=L.begin();
      for (int jj=0; jj<j; jj++) pj++;
      T.splice(m.right(),pj->begin());
      L.erase(pj);

      pos_t p = L.insert(L.begin(),btree_t());
      p->splice(p->begin(),T.begin());

      comb(L,f,data);

      p = L.begin();
      m = T.splice(T.begin(),p->begin());
      L.erase(p);

      pj=L.begin();
      for (int jj=0; jj<j; jj++) pj++;
      pj = L.insert(pj,btree_t());
      pj->splice(pj->begin(),m.right());
	
      pk=L.begin();
      for (int kk=0; kk<k; kk++) pk++;
      pk = L.insert(pk,btree_t());
      pk->splice(pk->begin(),m.left());

    }
  }
}
예제 #2
0
파일: WORDCHAIN.cpp 프로젝트: blmarket/icpc
int walk2(list_t::iterator it, int s, int t)
{
    if(s==t) return 0;
    for(int i=0;i<30;i++)
    {
        if(links[s][i].size())
        {
            output.insert(it, mp(links[s][i].back(),s));
            links[s][i].pop_back();
            return walk2(it, i,t);
        }
    }
    return -1;
}
예제 #3
0
파일: WORDCHAIN.cpp 프로젝트: blmarket/icpc
int pump(list_t::iterator it)
{
    int pos = it->second;
redo:
    for(int i=0;i<30;i++)
    {
        if(links[pos][i].size())
        {
            output.insert(it, mp(links[pos][i].back(), pos));
            links[pos][i].pop_back();
            if(walk2(it, i, pos) == -1) return -1;
            goto redo;
        }
    }
    return 0;
}