1118 Birds in Forest(25 分)

2018-09-02  本文已影响0人  zjh3029
#include<iostream>
#include<numeric>
using namespace std;

int N, M, K,L;
const int maxn = 10010;
bool exist[maxn];
int fa[maxn] = { 0 }, cnt[maxn] = { 0 };

int findFather(int x)
{
    int a = x;
    while (x!=fa[x])
    {
        x = fa[x];
    }
    while (a!=fa[a])//互相交换值
    {
        int z = a;
        a = fa[a];
        fa[z] = x;
    }
    return x;
}
void Union(int a, int b)
{
    int faA = findFather(a);
    int faB = findFather(b);
    if (faA!=faB)
    {
        fa[faA] = faB;
    }
}

int main()
{
    cin >> N;
    iota(fa, fa+maxn, 0);
    int id, temp;
    for (int i = 0; i < N; i++)
    {
        cin >> K >> id;
        exist[id] = true;
        for (int j = 0; j < K-1; j++)
        {
            cin >> temp;
            Union(id, temp);
            exist[temp] = true;
        }
    }

    for (int i = 1; i < maxn; i++)
    {
        if (exist[i]==true)
        {
            int root = findFather(i);
            cnt[root]++;
        }
    }
    int numtrees = 0, numbirds = 0;
    for (int i = 0; i < maxn; i++)
    {
        if (exist[i] == true && cnt[i]!= 0)
        {
            numtrees++;
            numbirds += cnt[i];
        }
    }
    cout << numtrees << " " << numbirds << endl;
    cin >> L;
    int ida, idb;
    for (int i = 0; i < L; i++)
    {
        cin >> ida >> idb;
        if (findFather(ida)==findFather(idb))
        {
            cout << "Yes" << endl;
        }
        else
        {
            cout << "No" << endl;
        }
    }

}
上一篇下一篇

猜你喜欢

热点阅读