1118. Birds in Forest (25)

并查集。。。要用路径压缩,不然会超时,

#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
#include<queue>
#include<set>
#include<stack>
using namespace std;

int father[10001];

int findf(int x) {
    int a =x;
    while (x != father[x]) {
        x = father[x];
    }
    
    while (a != father[a]) {
        int z = a;
        a = father[a];
        father[z] = x;
    }

    return x;
}

void Union(int a, int b) {
    int fa = findf(a);
    int fb = findf(b);

    if (fa != fb) {
        father[fa] = fb;
    }
}

int exist[10001];

int main() {
    int num;
    cin >> num;

    for (int i = 0; i < 10001; i++) {
        father[i] = i;
    }

    for (int i = 0; i < num; i++) {
        int n;
        cin >> n;
        int temp, pre = -1;
        for (int j = 0; j < n; j++) {
            
            cin >> temp;
            exist[temp] = 1;
            if (pre != -1) {
                Union(pre, temp);
            }
            pre = temp;
        }
    }
    int k = 1;
    while (exist[k] == 1) {
        
        k++;
    }
    k--;

    set<int> s;

    for (int i = 1; i <= k; i++) {
        s.insert(findf(i));
        //cout << findf(i) << ' ';
    }

    cout << s.size()<<' '<<k<<endl;

    int a;
    cin >> a;
    for (int i = 0; i < a; i++) {
        int p, q;
        cin >> p >> q;

        if (findf(p) == findf(q)) {
            cout << "Yes" << endl;
        }

        else {
            cout << "No" << endl;
        }
    }

    system("pause");
    
}

 

一定要记住这段。。。

posted on 2017-08-01 13:29  wsggb123  阅读(86)  评论(0)    收藏  举报

导航