1118 Birds in Forest (25分)[并查集]

By Jalan

文章目录

  • **By Jalan**
  • 知识工具需求
    • 数学
    • 数据结构和算法
    • 语言
  • 题干
    • 输入条件
    • 输出条件
    • 例子
      • 例1
        • 输入
        • 输出
  • 题解
    • 第一次
      • 思路
      • 预期时间复杂度
      • 编写用时
      • 代码
        • CPP
          • 运行用时
  • 结尾

知识工具需求

数学

数据结构和算法

  • 并查集

语言

题干

假设一张照片里的鸟在同一颗树上.问树和鸟的总数和鸟和鸟是否同树.

输入条件

N<=1000照片数
k Bi照片里的鸟数和鸟号4位
q问题数
b1 b2两只鸟

输出条件

树数 鸟数
这个q下的两只鸟在不在同一颗树

例子

例1

输入

4
3 10 1 2
2 3 4
4 1 5 7 8
3 9 6 4
2
10 5
3 7

输出

2 10
Yes
No

题解

第一次

思路

  1. 输入,在输入同时进行union.使用一个map来统计多少鸟.使用一个数组total把所有鸟的号存起来
  2. 使用另一个map统计多少树
  3. 按询问找两者的root一致同树Yes,不一致No

预期时间复杂度

编写用时

25分钟

代码

CPP

#include 
#include 
#include 
using namespace std;
void initiate(vector<int> &parent)
{
     
    for (int i = 0; i < parent.size(); i++)
    {
     
        parent[i] = i;
    }
}
int findRoot(int vertex, vector<int> &parent)
{
     
    int originVertex = vertex;
    while (parent[vertex] != vertex)
    {
     
        vertex = parent[vertex];
    }
    while (parent[originVertex] != originVertex)
    {
     
        int nowVertex = originVertex;
        parent[originVertex] = vertex;
        originVertex = parent[nowVertex];
    }
    return vertex;
}
int unionVertex(int va, int vb, vector<int> &parent)
{
     
    int ar = findRoot(va, parent);
    int br = findRoot(vb, parent);
    parent[ar] = br;
    return 1;
}
int main(int argc, char const *argv[])
{
     
    //1
    vector<int> parent(10001);
    initiate(parent);
    int n;
    scanf("%d", &n);
    unordered_map<int, int> birdsMap;
    vector<int> total;
    for (int i = 0; i < n; i++)
    {
     
        int lineCounter;
        scanf("%d", &lineCounter);
        vector<int> lineBirds;
        for (int j = 0, temp; j < lineCounter; j++)
        {
     
            scanf("%d", &temp);
            lineBirds.push_back(temp);
        }
        for (int j = 1; j < lineCounter; j++)
        {
     
            unionVertex(lineBirds[0], lineBirds[j], parent);
        }
        for (int j = 0; j < lineCounter; j++) //这个用于统计鸟.
        {
     
            birdsMap[lineBirds[j]]++;
            total.push_back(lineBirds[j]);
        }
    }
    //2
    unordered_map<int, int> treeMap;
    for (int i = 0; i < total.size(); i++)
    {
     
        treeMap[findRoot(total[i], parent)]++;
    }
    printf("%d %d\n", treeMap.size(), birdsMap.size());
    //3
    int q;
    scanf("%d", &q);
    for (int i = 0; i < q; i++)
    {
     
        int a, b;
        scanf("%d%d", &a, &b);
        if (findRoot(a, parent) == findRoot(b, parent))
        {
     
            printf("Yes\n");
        }
        else
        {
     
            printf("No\n");
        }
    }

    return 0;
}

运行用时

结尾

看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@
也欢迎关注我的CSDN账号呀,接下来两个月我应该会按这个格式更新所有的PTA甲级题目

                                        **开心code每一天**

你可能感兴趣的:(并查集题目)