首页 > 其他分享 >洛谷题单指南-集合-P2814 家谱

洛谷题单指南-集合-P2814 家谱

时间:2024-03-26 17:49:08浏览次数:19  
标签:map name 洛谷题 查集 father son P2814 家谱 string

原题链接:https://www.luogu.com.cn/problem/P2814

题意解读:已知多组父子关系,找某个人最早的祖先,并查集的应用。

解题思路:

由于存在真正的父子关系,所以在并查集合并的时候,要把p[x] = y中x设置为子,y设置为父,其余都是并查集的常规操作。

由于是计算姓名之间的父子关系,并查集可以用map<stirng, string> p来代替数组。

另外,由于需要对并查集进行初始化p[name] = name,因此先将所有数据读取存入map<string, vector<string>> h中,将所有要计算祖先的姓名存入

vector<string> q中,再遍历h进行集合合并,遍历q进行结果输出即可。

100分代码:

#include <bits/stdc++.h>
using namespace std;

map<string, vector<string>> h; //保存所有的父子关系
vector<string> q; //保存所有的要求祖先的人名
map<string, string> p; //并查集,由于父子关系是人名,因此用map来作并查集,p[name1] = name2表示name1的父亲是name2 

string find(string name)
{
    if(p[name] == name) return name;
    return p[name] = find(p[name]);
}

void merge(string son, string father)
{
    p[son] = father;
}

int main()
{
    char c;
    string father, son;
    while(cin >> c && c != '$')
    {
        if(c == '#') 
        {
            cin >> father;
            p[father] = father; //初始化并查集
        }
        if(c == '+')
        {
            cin >> son;
            h[father].push_back(son);
            p[son] = son; //初始化并查集
        } 
        if(c == '?')
        {
            cin >> son;
            q.push_back(son);
            p[son] = son;
        }
    }

    for(auto i : h)
    {
        for(auto j : i.second)
        {
            merge(j, i.first);
        }
    }

    for(auto i : q)
    {
        cout << i << " " << find(i) << endl;
    }

    return 0;
}

 

标签:map,name,洛谷题,查集,father,son,P2814,家谱,string
From: https://www.cnblogs.com/jcwy/p/18097171

相关文章

  • 洛谷题单指南-集合-P3879 [TJOI2010] 阅读理解
    原题链接:https://www.luogu.com.cn/problem/P3879题意解读:此题本质上是计算倒排索引,所谓倒排索引,即不是通过文章来找单词,而是通过单词来找文章。解题思路:要建立单词和文章之间的关系,一个单词对应多篇文章,且要按照文章编号排序,可以使用如下数据结构:map<string,set<int>>h;只......
  • 洛谷题单指南-集合-P1955 [NOI2015] 程序自动分析
    原题链接:https://www.luogu.com.cn/problem/P1955题意解读:要判断约数条件是否可以同时满足,主要是要判断不相等的情况。解题思路:对于相等的条件,直接进行集合合并即可;对于不相等的条件,判断两者是否属于同一个集合,如果形成矛盾,则条件不能成立。由于i,j的范围至10^9,定义并查集如果......
  • 洛谷题单指南-集合-P1892 [BOI2003] 团伙
    原题链接:https://www.luogu.com.cn/problem/P1892题意解读:此题与关押罪犯问题非常像,本质上就是要合并所有的朋友。解题思路:首先,初始化并查集;对于每一对人的关系,如果是朋友,直接进行合并;如果是敌人,先查看双方之前是否有记录其他敌人,如果有,则将一方与另一方的敌人进行合并,如果没......
  • 洛谷题单指南-集合-P1621 集合
    原题链接:https://www.luogu.com.cn/problem/P1621题意解读:a~b之间的数,把有大于等于p的公共质因数的数进行合并作为一个集合,求一共有多少个集合。解题思路:要进行集合合并、统计集合数,可以使用并查集,有两种做法:1、暴力法80%的数据在1000范围内,因此通过双重循环枚举,判断两个数的......
  • 拓扑排序 洛谷B3644家谱树解法
    #include<bits/stdc++.h>usingnamespacestd;intd[101];//d[i]表示i点的入度个数intt[101][101];//t[i][j]表示i点到j点间有一条有向边queue<int>q;//q表示当前入度为0的节点intmain(){ //所有数组初始化为0 memset(d,0,sizeof(d)); memset(t,0,sizeof(t......
  • 洛谷题单算法1-6二分查找与二分答案
    代码仅供参考,不足之处望理解。P2249【深基13.例1】查找#include<iostream>usingnamespacestd;constintN=1e6+5;intn,m,a[N];intmain(){ios::sync_with_stdio(false);//输入cin>>n>>m;for(inti=1;i<=n;i++)cin>>a[i];for(inti=1......
  • C语言:洛谷题目分享(4)小书童--凯撒密码和笨小猴
    目录1.前言2.俩道题目1.小书童--凯撒密码1.题目背景2.题目描述3.输入格式4.输出格式5.题解2.笨小猴1.题目描述2.输入格式3.输出格式4.题解3.小结1.前言哈喽大家好啊,今天我继续为大家分享洛谷题单的俩道题目,请大家多多支持喔~2.俩道题目1.小书童--凯撒密码......
  • 【附源码】java数字家谱管理系统(ssm毕业设计+maven+vue+计算机专业)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义标题:数字家谱管理系统的选题背景及其意义随着信息技术的快速发展,数字化已经成为现代社会的一种趋势。在传统文化的传承与保护方面,数字技术的应用尤为重要。家谱作......
  • 洛谷题单指南-集合-P1525 [NOIP2010 提高组] 关押罪犯
    原题链接:https://www.luogu.com.cn/problem/P1525题意解读:有很多罪犯,要关到两座监狱,有一些罪犯之间有仇,并且可以量化出仇恨值,如果关在一起就会冲突,造成的影响就是仇恨值,要使得造成的影响最小,如果可以完全不起冲突,输出0。解题思路:首先,要让冲突影响最小化,显然应该把仇恨大的罪犯......
  • 洛谷题单指南-集合-P1102 A-B 数对
    原题链接:https://www.luogu.com.cn/problem/P1102题意解读:前文https://www.cnblogs.com/jcwy/p/18043197介绍了二分和双指针的做法,本文介绍hash的做法。解题思路:定义map<int,int>h,保存每个数+c出现的个数同样,先将所有数由小到大哦排序遍历每一个数x,答案累加ans+=h[x]然......