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

    技术2022-07-11  112

    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

    题解

    第一次

    思路

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

    预期时间复杂度

    编写用时

    25分钟

    代码

    CPP

    #include <bits/stdc++.h> #include <stdio.h> #include <vector> 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; }
    运行用时

    结尾

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

    **开心code每一天**
    Processed: 0.012, SQL: 9