int removeStones(vector<vector<int>>& stones) {
   const int kSize = 10000;
   DSU dsu(kSize * 2);
   for (const auto& stone : stones)
     dsu.Union(stone[0], stone[1] + kSize);
   unordered_set<int> seen;
   for (const auto& stone : stones)
     seen.insert(dsu.Find(stone[0]));
   return stones.size() - seen.size();
 }
コード例 #2
0
int main(){

    long n, m; scanf("%ld %ld", &n, &m);
    std::vector<long> s(m + 1, 0), t(m + 1, 0);
    for (long p=1; p<=m; p++){scanf("%ld %ld", &s[p], &t[p]);}

    std::vector<dsu> left(m + 2, dsu(n + 1)), right(m + 2, dsu(n + 1));
    for (long p = 1; p <= m; p++){left[p] = left[p - 1]; left[p].join(s[p], t[p]);}
    for (long p = m; p >= 1; p--){right[p] = right[p + 1]; right[p].join(s[p], t[p]);}

    long k; scanf("%ld", &k);
    while(k--){
        long l, r; scanf("%ld %ld", &l, &r); 
        dsu u = left[l - 1];
        for(long p = 1; p <= n; p++){if(right[r + 1].f[p]){u.join(p, right[r+1].f[p]);}}
        printf("%ld\n", u.count - 1);   //because the nodes are numbered 1 through n, and create a struct of size (n + 1);
    }

    return 0;
}
コード例 #3
0
ファイル: hw6.p2.cpp プロジェクト: AOrazaev/orazaev
double FindOptimalRangeForAgentsRadio(TAgentsVector* agents) {
    if (agents->size() < 2) {
        return 0.0;
    }

    TEdgeHeap edgeHeap = CreateEdgeHeap(agents);

    TAgentsDSU dsu(agents->size());

    TEdge currentEdge;
    while (dsu.GetNumberOfClasses() > 1) {
        currentEdge = edgeHeap.top();
        edgeHeap.pop();

        dsu.Unite(currentEdge.GetFirstAgentIndex(),
                  currentEdge.GetSecondAgentIndex());
    }

    return currentEdge.GetWeight();
};