void TCliqueOverlap::Expand(const THashSet<TInt>& SUBG, THashSet<TInt>& CAND) { if (SUBG.Len()==0) { if (m_Q.Len() >= m_minMaxCliqueSize) { m_Q.Pack(); m_maxCliques->Add(m_Q); } return; } if (CAND.Len()==0) return; //Get u that maximaze CAND intersection with neighbours of vertex u int u = MaxNbrsInCANDNodeId(SUBG, CAND); //Get neighbours of node u THashSet<TInt> nbrsU; GetNbrs(u, nbrsU); //Get relative complement of nbrsU in CAND THashSet<TInt> EXT; GetRelativeComplement(CAND, nbrsU, EXT); while(EXT.Len() != 0) { int q = GetNodeIdWithMaxDeg(EXT); // m_Q.Add(q); // THashSet<TInt> nbrsQ; GetNbrs(q, nbrsQ); // THashSet<TInt> SUBGq; GetIntersection(SUBG, nbrsQ, SUBGq); // THashSet<TInt> CANDq; GetIntersection(CAND, nbrsQ, CANDq); // Expand(SUBGq, CANDq); // CAND.DelKey(q); m_Q.DelLast(); // EXT.Clr(); GetRelativeComplement(CAND, nbrsU, EXT); } }