Exemple #1
0
/***************************** findParent *********************************
 NodeT *findParent(NodeT *pParent, NodeT *p, NodeT *pkid)
 Purpose:
    Finds the parent of the child we are currently on.
 Parameters:
    NodeT *pParent
    NodeT *p
    NodeT *pkid
 Returns:
    Returns that specified child's parent node.
 **************************************************************************/
NodeT *findParent(NodeT *pParent, NodeT *p, NodeT *pkid)
{
    NodeT *pFound = NULL;
    
    //if tree passed in is NULL
    if (p == NULL)
        return NULL;

    //pkid has been found
    if (strcmp(p->element.szId,pkid->element.szId)==0)
        return pParent;

    //traverse sibling nodes
    if (p->pSibling !=NULL)
        pFound = findParent(pParent,p->pSibling,pkid);
    
    //pkid has been found so dont traverse through children
    if (pFound != NULL)
        return pFound;
    
    //traverse child nodes
    if (p->pChild != NULL)
        pFound = findParent(p,p->pChild,pkid);

    //if found in child nodes, returns the found node, else it returns NULL
    return pFound;
}
void unionTwo(int f, int t) {

    int a = findParent(f);
    int b = findParent(t);
    if (a == b) return;
    if (a > b) {
        parent[a] = b;
    } else {
        parent[b] = a;
    }
}
Exemple #3
0
void unionFind::unite(int child1, int child2){
    unionFindNode *parent1 = findParent(child1);
    unionFindNode *parent2 = findParent(child2);
    if (parent1->getParent() == parent2->getParent())
        return;
    if (parent1->getRank() < parent2->getRank()) {
        parent1->setParent(parent2->getParent());
    } else {
        parent2->setParent(parent1->getParent());
        if (parent2->getRank() == parent1->getRank())
            parent1->setRank(parent1->getRank()+1);
    }
}
Exemple #4
0
    int minMalwareSpread(vector<vector<int>>& graph, vector<int>& initial) {
        int n = graph.size(); 
        parent.clear();
        count.clear();   
        for(int i = 0; i < n; ++i) {
            parent[i] = i; count[i] = 1;
        }
        vector<int> visited(n, false);

        for(int i = 0; i < n; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(graph[i][j])
                {
                    int pi = findParent(i);
                    int pj = findParent(j);
                    if(pi != pj)
                    {
                        parent[pi] = pj;
                        count[pj] += count[pi];
                    }
                }
            }
        }

        sort(initial.begin(), initial.end());
        map<int, vector<int>> m;
        for(int i : initial)
        {
            m[findParent(i)].push_back(i);
        }

        int minCount = 0;
        int minIdx = initial[0];

        for(const auto& p : m)
        {
            if(p.second.size() == 1)
            {
                if(count[p.first] > minCount)
                {
                    minCount = count[p.first];
                    minIdx = p.second[0];
                }
            }
        }
        return minIdx;
    }
    void unionSets(int x, int y) {
        int root0 = findParent(x);
        int root1 = findParent(y);

        if (root0 == root1) return;

        if (componentSize[root0] >= componentSize[root1]) {
            componentSize[root0] += componentSize[root1];
            parent[root1] = root0;
        } else {
            componentSize[root1] += componentSize[root0];
            parent[root0] = root1;
        }
        numberOfDisjointSets--;
    }
Exemple #6
0
void BST::drop(int key) {
  if(empty())
    return;

  Node *keyNode = findParent(key);

  if(keyNode->key() == key) {
    Node *successor = findSuccessor(keyNode);

    if(successor == NULL) { // No right subtree.
      if(root != keyNode) {
        if(keyNode->parent->left == keyNode)
          keyNode->parent->left = keyNode->left;
        else
          keyNode->parent->right = keyNode->left;
      }
      else root = keyNode->left;
    }
    else replaceWithSuccessor(keyNode, successor);
    
    keyNode->parent = NULL;
    keyNode->left   = NULL;
    keyNode->right  = NULL;
    delete keyNode;
  }
}
Symbol *VariableTable::findProperty(ClassScopePtr &cls,
                                    const string &name,
                                    AnalysisResultConstPtr ar) {
  Symbol *sym = getSymbol(name);
  if (sym) {
    assert(sym->declarationSet());
    if (!sym->isOverride()) {
      return sym;
    }
    assert(!sym->isStatic());
    sym = nullptr;
  }

  if (!sym) {
    if (ClassScopePtr parent = findParent(ar, name, sym)) {
      sym = parent->findProperty(parent, name, ar);
      if (sym) {
        cls = parent;
        return sym;
      }
    }
  }

  return sym;
}
bool VariableTable::markOverride(AnalysisResultPtr ar, const string &name) {
  Symbol *sym = getSymbol(name);
  assert(sym && sym->isPresent());
  bool ret = false;
  if (!sym->isStatic() ||
      (sym->isPublic() && !sym->getClassInitVal())) {
    Symbol *s2;
    ClassScopePtr parent = findParent(ar, name, s2);
    if (parent) {
      assert(s2 && s2->isPresent());
      if (!s2->isPrivate()) {
        if (!sym->isStatic() || s2->isProtected()) {
          if (sym->isPrivate() || sym->isStatic()) {
            // don't mark the symbol as overridden
            return true;
          }
          if (sym->isProtected() && s2->isPublic()) {
            // still mark the symbol as overridden
            ret = true;
          }
          sym->setOverride();
        }
      }
    }
  }
  return ret;
}
Exemple #9
0
void bst::insert(int key)
{
	filereader fileReader;
	fileReader.open(fileName, 'x');
	bst_node parentNode;
	long parentOffset = findParent(key, &parentNode);
	if (parentOffset != INVALID_OFFSET)
	{
		bst_node newNode(key);
		fileReader.seek(0, END);
		long childOffset = fileReader.offset();
		fileReader.write_raw((char *) &newNode, sizeof(bst_node));

		if (key < parentNode.key)
		{
			parentNode.l = childOffset;
		}
		else if (key > parentNode.key)
		{
			parentNode.r = childOffset;
		}

		fileReader.seek(parentOffset, BEGIN);
		fileReader.write_raw((char *) &parentNode, sizeof(bst_node));
	}
	else
	{
		bst_node newNode(key);
		fileReader.write_raw((char *) &newNode, sizeof(bst_node));
	}
	fileReader.close();
}
int main() {
    int t;
    scanf("%d", &t);
    while (t > 0) {
        t--;
        scanf("%d%d", &n, &m);
        for (i = 1; i < n + 1; i++) {
            parent[i] = i;
        }
        for (i = 0; i < m; i++) {
            int a, b;
            scanf("%d%d", &a, &b);
            unionTwo(a, b);
        }
        for (i = 1; i < n + 1; i++) {
            parent[i] = findParent(i);
        }
        int num = 0;
        for (i = 1; i < n + 1; i++) {
            if (parent[i] == i) {
                num++;
            }
        }
        printf("%d\n", num);
    }
    return 0;
}
Exemple #11
0
const Node* BST::find(int key) const {
  Node *node = findParent(key);

  if(node->key() == key)
    return node;
  else
    return NULL;
}
Exemple #12
0
int findParent(int x){
	if (subs[x].p != x)	{
		int p = subs[x].p;
		subs[x].p = findParent(subs[x].p);
		subs[x].w = (subs[x].w + subs[p].w);
	}
	return subs[x].p;
}
Exemple #13
0
 int findParent(int x, vector<int> &parent) {
     
     if(parent[x] == x) return x;
     
     parent[x] = findParent(parent[x],parent);
     
     return parent[x];
 }
 /*
  * @param a: An integer
  * @param b: An integer
  * @return: nothing
  */
 void connect(int a, int b) {
     int parentOfNodeA = findParent(a), parentOfNodeB = findParent(b);
     
     if(parentOfNodeA == parentOfNodeB)
         return ;
     
     -- numOfConnectedComponents;
     
     int connectedParent = parentOfNode[parentOfNodeA] + parentOfNode[parentOfNodeB];
     if(parentOfNode[parentOfNodeA] > parentOfNode[parentOfNodeB]) {
         parentOfNode[parentOfNodeA] = parentOfNodeB;
         parentOfNode[parentOfNodeB] = connectedParent;
     } else {
         parentOfNode[parentOfNodeB] = parentOfNodeA;
         parentOfNode[parentOfNodeA] = connectedParent;
     }
 }
Exemple #15
0
    void Union(int x, int y, vector<int> & parent, vector<int> & sz, int &total) {
    
        int x1 = findParent(x,parent);
        int y1 = findParent(y,parent);

        if(x1==y1) return;
        
        if (sz[x1] < sz[y1]) { 
            parent[x1] = y1;   //注意一定是x,y的root在赋值  不是x,y
            sz[x1] += sz[y1]; 
        }
        else { 
            parent[y1] = x1;
            sz[y1] += sz[x1]; 
        }
        
        --total;
    }
void TransferListView::update(const NTransfer& transfer) {
    TransferListItem* file = findTransfer(transfer.user, transfer.filename);
    if (!file ) {
        file = new TransferListItem(findParent(transfer.user), transfer.user, transfer.filename);
        museeq->flush(); // Needed to avoid transfers being added times when update() is called twice.
    }

    file->update(transfer);
}
Exemple #17
0
std::shared_ptr<ControlResizer::ControlResizerItem> ControlResizer::findParent(const std::map<HWND, std::shared_ptr<ControlResizerItem>>& controls, HWND hwndParent) const
{
	for (auto& control : controls)
	{
		if (control.first == hwndParent)
			return control.second;
		findParent(control.second->controls, hwndParent);
	}
	return nullptr;
}
Exemple #18
0
    const Tile& getTile(const uint8_t z, const uint32_t x_, const uint32_t y) {

        if (z > options.maxZoom)
            throw std::runtime_error("Requested zoom higher than maxZoom: " + std::to_string(z));

        const uint32_t z2 = std::pow(2, z);
        const uint32_t x = ((x_ % z2) + z2) % z2; // wrap tile x coordinate
        const uint64_t id = toID(z, x, y);

        auto it = tiles.find(id);
        if (it != tiles.end())
            return it->second.tile;

        it = findParent(z, x, y);

        if (it == tiles.end())
            throw std::runtime_error("Parent tile not found");

        // if we found a parent tile containing the original geometry, we can drill down from it
        const auto& parent = it->second;

        // parent tile is a solid clipped square, return it instead since it's identical
        if (parent.is_solid)
            return parent.tile;

        // drill down parent tile up to the requested one
        splitTile(parent.source_features, parent.z, parent.x, parent.y, z, x, y);

        it = tiles.find(id);
        if (it != tiles.end())
            return it->second.tile;

        it = findParent(z, x, y);
        if (it == tiles.end())
            throw std::runtime_error("Parent tile not found");

        // drilling stopped because parent was a solid square; return it instead
        if (it->second.is_solid)
            return it->second.tile;

        // otherwise it was an empty tile
        return empty_tile;
    }
Exemple #19
0
void findParent(int target,int* target_parent) {
	int i;
	target_parent[count++] = target;
	for (i = 1; i <= n; i++) {
		if (graph[i][target] == 1) {
			
			findParent(i,target_parent);
			//target1_parent[count++] = i;
		}
	}
}
Exemple #20
0
void nca() {
	int i;
	int j;
	findParent(target1, target1_parent);
	findParent(target2, target2_parent);
	for (i = 0; i <100; i++) {

		for (j = 0; j < 100; j++) {
			if (target1_parent[i] != 0 && target2_parent[j] != 0) {
				if (target1_parent[i] == target2_parent[j]) {
					printf("%d", target1_parent[i]);
					return;
				}
			}
		}


	}
	
}
Exemple #21
0
 TimerPtr
     Dashboard::getTimer(const std::string & theName) {
         std::map<std::string,TimerPtr>::iterator found = _myTimers.find(theName);
         if (found == _myTimers.end()) {
             TimerPtr myParent   = findParent();
             TimerPtr myNewTimer = TimerPtr(new Timer(myParent));
             _myTimers[theName]  = myNewTimer;
             myNewTimer->setName(theName);
             _mySortedTimers.push_back(std::make_pair(theName, myNewTimer));
             return myNewTimer;
         }
         return found->second;
 }
 bool validTree(int n, vector<pair<int, int>>& edges) {
     if (edges.size() != n - 1) {
         return false;
     }
     vector<int> parent(n);
     for (int i = 0; i < n; ++i) {
         parent[i] = i;
     }
     
     for (auto& edge : edges) {
         int p1 = findParent(parent, edge.first);
         int p2 = findParent(parent, edge.second);
         if (p1 != p2) {
             parent[p1] = parent[p2];
         }
         else {
             return false;
         }
     }
     
     return true;
 }
Exemple #23
0
        BVHSceneNode* BVHSceneTree::findParent(BVHSceneNode* node, SceneObject* object) const
        {
            BVHSceneNode* parent = nullptr;

            if(node->type == SceneNodeType::Leaf)
            {
                if(node->object == object)
                {
                    parent = node;
                }
            }
            else
            {
                parent = findParent(node->left, object);

                if(parent == nullptr)
                {
                    parent = findParent(node->right, object);
                }
            }

            return parent;
        }
void TransferListView::setGroupMode(GroupMode mode) {
    if(mode == mGroupMode)
        return;

    mGroupMode = mode;

    if(mGroupMode == None) {
        QList<QTreeWidgetItem *> items;
        QList<QTreeWidgetItem *> subitems;
        QList<QTreeWidgetItem *>::iterator sitx;
        items = invisibleRootItem()->takeChildren ();
        QList<QTreeWidgetItem *>::iterator itx = items.begin();
        for(; itx != items.end(); ++itx) {
            if ( ! ( *itx)->text(1).isNull())
                invisibleRootItem()->addChild(*itx);
            else {
                subitems = (*itx)->takeChildren();
                sitx = subitems.begin();
                for(; sitx != subitems.end(); ++sitx)
                    invisibleRootItem()->addChild(*sitx);
            }
        }

        setRootIsDecorated(false);
    }
    else {
        QList<QTreeWidgetItem *> items;

        items = invisibleRootItem()->takeChildren ();

        QList<QTreeWidgetItem *>::iterator itx = items.begin();
        for(; itx != items.end(); ++itx) {
            if ( (*itx)->text(1).isNull())
                invisibleRootItem()->addChild(*itx);
        }
        itx = items.begin();
        for(; itx != items.end(); ++itx) {
            if (! (*itx)->text(1).isNull()) {
                TransferListItem *itxx = dynamic_cast<TransferListItem *>(*itx);
                if (itxx)
                    findParent(itxx->user())->addChild(*itx);
            }
        }

        updateParentsStats();

        setRootIsDecorated(true);
    }
}
// ---------------------------------------------------------------------------
// 
// -----------
bGenericXMLBaseElement* bClassesMgr::ParseXMLDescriptors(bArray* xml){
_bTrace_("bClassesMgr::ParseXMLDescriptors",true);
int						i,n;
xmlelt					xelt;
bGenericXMLBaseElement	*elt,*parent;
	
	n=xml->count();
	if(n<1){
_te_("empty array");
		return(NULL);
	}
	for(i=1;i<=n;i++){
		if(!xml->get(i,&xelt)){
_te_("xml->get failed");
			return(NULL);
		}
		if((i==1)&&(xelt.indent!=0)){
_te_("(i==1)&&(elt->indent!=0)");
			return(NULL);
		}
		elt=(bGenericXMLBaseElement*)CreateXMLInstance(xelt.name);
		if(!elt){
_te_("instance not found :"+xelt.name);
			return(NULL);
		}
		xelt.element=elt;
		if(!xml->put(i,&xelt)){
_te_("xml->put failed");
			return(NULL);
		}
		elt->setvalue(xelt.value);
		
		if(i>1){
			parent=(bGenericXMLBaseElement*)findParent(xml,i,xelt.indent);
			if(!parent){
_te_("no parent");
				return(NULL);
			}
			if(!parent->addelement(elt)){
_te_("parent->addelement(elt) returns false");
				return(NULL);
			}
		}
	}
	xml->get(1,&xelt);
	return(xelt.element);
}
Exemple #26
0
void ControlResizer::addControl(HWND hwndCtl, HWND hwndParent, const AnchorStyle& anchorStyle) const
{
	std::shared_ptr<ControlResizerItem> parent;
	if (!hwndParent || hwndParent == window->hWnd)
		parent = window;
	else
		parent = findParent(window->controls, hwndParent);
	if (!parent)
		throw std::exception("Parent not found");
	RECT rect;
	GetWindowRect(hwndCtl, &rect);
	MapWindowPoints(HWND_DESKTOP, window->hWnd, (LPPOINT)&rect, 2);
	std::shared_ptr<ControlResizerItem> item = std::make_shared<ControlResizerItem>();
	item->hWnd = hwndCtl;
	item->anchorStyle = anchorStyle;
	item->newRect = rect;
	parent->controls[hwndCtl] = item;
}
Exemple #27
0
//  In the vector, pass back pointers to vs copies of the families.
//  Requires that the caller cleans up the families after!!
int CDFamily::createFamilies(vector<CCdCore*>& cds, vector<CDFamily*>& families)
{
	vector<CCdCore*>::iterator cdIterator = cds.begin();
	while(cdIterator != cds.end())
	{
		CCdCore* cd = *cdIterator;
		if (!findParent(cd, cds))  //no parent, then use this cd as a root of family
		{
			CDFamily* cdFamily = new CDFamily(cd);
			cds.erase(cdIterator);
			extractFamily(cd, *cdFamily, cds);
			families.push_back(cdFamily);
			cdIterator = cds.begin();
		}
		else
			++cdIterator;
	}
	return families.size(); //all cds should be added
}
// Find the ancestors of a locale, and fill 'out' with it (assumes out has enough
// space). If any of the members of stop_list was seen, write it in the
// output but stop afterwards.
//
// This also outputs the index of the last written ancestor in the stop_list
// to stop_list_index, which will be -1 if it is not found in the stop_list.
//
// Returns the number of ancestors written in the output, which is always
// at least one.
//
// (If 'out' is nullptr, we do everything the same way but we simply don't write
// any results in 'out'.)
    size_t findAncestors(uint32_t *out, ssize_t *stop_list_index,
                         uint32_t packed_locale, const char *script,
                         const uint32_t *stop_list, size_t stop_set_length) {
        uint32_t ancestor = packed_locale;
        size_t count = 0;
        do {
            if (out != nullptr) out[count] = ancestor;
            count++;
            for (size_t i = 0; i < stop_set_length; i++) {
                if (stop_list[i] == ancestor) {
                    *stop_list_index = (ssize_t) i;
                    return count;
                }
            }
            ancestor = findParent(ancestor, script);
        } while (ancestor != PACKED_ROOT);
        *stop_list_index = (ssize_t) -1;
        return count;
    }
TypePtr VariableTable::checkProperty(BlockScopeRawPtr context,
                                     Symbol *sym, TypePtr type,
                                     bool coerce, AnalysisResultConstPtr ar) {
  always_assert(sym->isPresent());
  if (sym->isOverride()) {
    Symbol *base;
    ClassScopePtr parent = findParent(ar, sym->getName(), base);
    assert(parent);
    assert(parent.get() != &m_blockScope);
    assert(base && !base->isPrivate());
    if (context->is(BlockScope::FunctionScope)) {
      GET_LOCK(parent);
      type = parent->getVariables()->setType(ar, base, type, coerce);
    } else {
      TRY_LOCK(parent);
      type = parent->getVariables()->setType(ar, base, type, coerce);
    }
  }
  return setType(ar, sym, type, coerce);
}
Exemple #30
0
void BST::insert(int key, double value) {
  if(empty())
    root = new Node(key, value);
  else {
    Node *parent = findParent(key);

    // Not the multiset.
    if(key == parent->key())
      return;
    
    Node *newNode = new Node(key, value);
    if(key < parent->key())
      parent->left = newNode;

    if(key > parent->key())
      parent->right = newNode;

    newNode->parent = parent;
  }
}