DongDong认亲戚 - 并查集

简介: DongDong认亲戚 - 并查集

题目描述

DongDong每年过春节都要回到老家探亲,然而DongDong记性并不好,没法想起谁是谁的亲戚(定义:若A和B是亲戚,B和C是亲戚,那么A和C也是亲戚),她只好求助于会编程的你了。

输入描述:

第一行给定n,m表示有n个人,m次操作

第二行给出n个字符串,表示n个人的名字分别是什么(如果出现多个人名字相同,则视为同一个人)(保证姓名是小写字符串)

接下来m行,每行输入一个数opt,两个字符串x,y

当opt=1时,表示x,y是亲戚

当opt=2时,表示询问x,y是否是亲戚,若是输出1,不是输出0

数据范围:1<=n,m<=20000,名字字符长度小等于10

输出描述:

对于每个2操作给予回答

示例1

输入

4 4

chen lin yi cheng

2 chen lin

1 chen lin

1 yi lin

2 yi lin

输出

0

1

思路

并查集模板题,我写了一个路径压缩和按秩合并的板子,一般来说够用了

#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
const int N = 1e5+10;

string s[N];
// dep 代表的是每个以i节点为根的子树的深(高)度 
int dep[N];
// i的父亲节点是 fa[i] 
int fa[N];

void init() {
  for(int i=1;i<=100000;i++) {
    fa[i]=i;
    rank[i]=1; 
  }
} 

int find(int x) {
  return x == fa[x]?x:(fa[x]=find(fa[x]));
}

void merge(int i,int j) {
  // x是i的爹 ,y是j的爹 
  int x = find(i);
  int y = find(j);
  
  //这里是判断两棵树分别的深度
  //将 深度小的树 往 深度大的树 上合并 
  //以免出现树越来高的情况 
  if(dep[x]<=dep[y]) fa[x] = y;
  else fa[y]=x;
  
  //如果两棵不同的树高度一样,那么随便谁合并谁都行,但是高度会加一(相当于加的是那个树的根) 
  if(dep[x]==dep[y] && x!=y) {
    dep[y]++;
  }
}

// map 映射一下 字符串 -> [1,n]的数字 
map<string,int>mp;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  
  int n,m,op;
  cin>>n>>m;
  string x,y;
  
  for(int i=1;i<=n;i++) cin>>s[i],mp[s[i]]=i,fa[i]=i,dep[i]=1;
  while(m--) {
    cin>>op>>x>>y;
    if(op == 1) {
      merge(mp[x],mp[y]);
    }else {
      int i = find(mp[x]);
      int j = find(mp[y]);
      cout<<(i==j?1:0)<<endl;
    }
  }
  
  return 0;
} 

目录
相关文章
|
17天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
17天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
算法 Android开发 C++
LeetCode 周赛上分之旅 #49 再探内向基环树
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
90 1
|
6月前
【错题集-编程题】过河卒(动态规划-路径问题)
【错题集-编程题】过河卒(动态规划-路径问题)
|
算法
关押罪犯(并查集加点问题最详细讲解)
关押罪犯(并查集加点问题最详细讲解)
78 0
关押罪犯(并查集加点问题最详细讲解)
|
算法
Gang团伙 (并查集+加点,拆点)
Gang团伙 (并查集+加点,拆点)
63 0
|
算法
【过河卒】回溯算法保姆式解题
【过河卒】回溯算法保姆式解题
95 0
|
C语言
【每日一道智力题】之高楼扔只因蛋
【每日一道智力题】之高楼扔只因蛋
167 0