朋友(并查集)

2023-05-16

朋友(AC in luogu P2078)


题目背景

小明在A公司工作,小红在B公司工作。

题目描述

这两个公司的员工有一个特点:一个公司的员工都是同性。

A公司有N名员工,其中有P对朋友关系。B公司有M名员工,其中有Q对朋友关系。朋友的朋友一定还是朋友。

每对朋友关系用两个整数(Xi,Yi)组成,表示朋友的编号分别为Xi,Yi。男人的编号是正数,女人的编号是负数。小明的编号是1,小红的编号是-1.

大家都知道,小明和小红是朋友,那么,请你写一个程序求出两公司之间,通过小明和小红认识的人最多一共能配成多少对情侣。(包括他们自己)

输入输出格式

输入格式:
第1行,4个空格隔开的正整数N,M,P,Q。

之后P行,每行两个正整数Xi,Yi。

之后Q行,每行两个负整数Xi,Yi。

输出格式:
一行,一个正整数,表示通过小明和小红认识的人最多一共能配成多少对情侣。(包括他们自己)

输入输出样例

输入样例#1:
4 3 4 2
1 1
1 2
2 3
1 3
-1 -2
-3 -3
输出样例#1:
2
说明

对于30%数据,N,M<=100,P,Q<=200

对于80%数据,N,M<=4000,P,Q<=10000.

对于全部数据,N,M<=10000,P,Q<=20000。

Solution

简单的并差集问题,只要在模组上稍作改动。
显然有:
1.需建立两个族谱。

par1[maxn];
par2[maxn];

2.第二个族谱中将负数序号转换为正数。

x=-x;
y=-y;

3.保证两个族谱中与1有亲缘关系的元素的祖宗都是1。只要在连接亲缘关系时,保证序号较小的是祖宗就好了。

//不同函数实现不同
if(x<y){
par[y]=x;
}
else{
par[x]=y;
}

得到代码如下

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

const int maxn=10001,maxp=20001;
int par1[maxn],par2[maxn];
int n,m,p,q;
int can1=0,can2=0;

inline void pre_treat(){
    for(int i=1;i<=n;i++)  par1[i]=i;
    for(int i=1;i<=m;i++)  par2[i]=i;
}

inline int find1(int x){
    if(par1[x]==x)  return x;
    else{
        return par1[x]=find1(par1[x]);
    }
}

inline int find2(int x){
    if(par2[x]==x)  return x;
    else{
        return par2[x]=find2(par2[x]);
    }
}

inline void unite1(int x,int y){
    x=find1(x);
    y=find1(y);
    if(x==y)  return ;
    if(x<y){
        par1[y]=x;
        return ;
    }
    par1[x]=y;
}

inline void unite2(int x,int y){
    x=find2(x);
    y=find2(y);
    if(x==y)  return ;
    if(x<y){
        par2[y]=x;
        return ;
    }
    par2[x]=y;
}

int main(){
    scanf("%d%d%d%d",&n,&m,&p,&q);
    pre_treat();
    for(int i=1;i<=p;i++){
        int x,y;scanf("%d%d",&x,&y);
        unite1(x,y);
    }
    for(int i=1;i<=q;i++){
        int x,y;scanf("%d%d",&x,&y);
        x=-x;  y=-y;
        unite2(x,y);
    }
    for(int i=1;i<=n;i++){
        if(find1(i)==1){
            can1++;
        }
    }
    for(int i=1;i<=m;i++){
        if(find2(i)==1){
            can2++;
        }
    }
    //printf("%d %d\n",can1,can2);
    printf("%d\n",min(can1,can2));
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

朋友(并查集) 的相关文章

  • 蓝桥杯分考场

    历届试题 分考场 时间限制 xff1a 1 0s 内存限制 xff1a 256 0MB 问题描述 n个人参加某项特殊考试 为了公平 xff0c 要求任何两个认识的人不能分在同一个考场 求是少需要分几个考场才能满足条件 输入格式 第一行 xf
  • CCF_Markdown(正则表达式)

    试题编号 xff1a 201703 3试题名称 xff1a Markdown时间限制 xff1a 1 0s内存限制 xff1a 256 0MB问题描述 xff1a 问题描述 Markdown 是一种很流行的轻量级标记语言 xff08 lig
  • idea常用的插件

    1 lombok 省略get set方法 2 Alibaba Java Coding Guidelines 阿里的代码规范 3 Translation 谷歌中英文翻译工具 4 CodeGlance 代码迷你缩放图插件 xff0c 快速下拉拖
  • Hadoop windows本地环境安装

    hadoop使用java编写 xff0c 所以windows安装和java一样也需要配置环境变量 一 下载所需文件 JDK下载地址 xff0c jdk1 8下载Hadoop下载 xff0c hadoop下载 xff0c 进去后找到一个版本然
  • Gitlab的安装及使用

    1 GitLab概述 1 1 GitLab介绍 GitLab是利用Ruby on Rails一个开源的版本管理系统 xff0c 实现一个自托管的Git项目仓库 xff0c 可通过Web界面进行访问公开的或者私人项目 GitLab能够浏览源代
  • C语言例程:用二维数组实现矩阵转置

    用二维数组实现矩阵转置 本实例将输入的 3 4 矩阵转置为 4 3 矩阵 xff0c 并输出结果 通过本实例 xff0c 可以学习如何使用二 维数组 实例解析 二维数组的定义 二维数组定义的一般形式为 xff1a 第一部分 基础篇 X227
  • C++头文件的相互引用问题(#include” xxx“使用)

    188条消息 C C 43 43 头文件的引用问题 xff08 include使用 xff09 保护大苹果 CSDN博客 c 43 43 include头文件
  • 树莓派设置自动连接无线网络

    树莓派开机后自动连接无线网络方法 xff0c 亲测有效 1 在任意方法 xff08 无线或有线 xff09 已经连接树莓派的基础上 xff0c 执行该命令 xff0c 意思是编辑wpa supplicant conf这个文件 内容如下 xf
  • 常用快捷键(1)----Windows组合键

    单个的Windows键是打开和隐藏开始菜单 xff0c 功能与 Esc 43 Ctrl 组合键功能相同 下面是一些常用的Windows组合键 xff1a 1 快捷键 xff1a Windows 43 Shift 43 S 功能 xff1a
  • android 获取唯一Id,小小总结一下。仅供参考

    1 获取imei xff1a 前言 xff1a 因传统的移动终端设备标识如国际移动设备识别码 xff08 IMEI xff09 等已被部分国家认定为用户隐私的一部分 xff0c 并存在被篡改和冒用的风险 xff0c 所以在Android 1
  • xib中添加自定义可编辑属性

    IOS开发中 xff0c 有些人喜欢使用xib来进行项目的开发 xff0c 使用xib可以使界面可视化 xff0c 很多控件的属性设置都可以在 xib 中设置 xff0c 减少了代码量 xff1b 同时不用一遍遍的运行程序看效果 xff0c
  • STM32使用寄存器工程模板点亮一个LED灯

    1 环境说明 xff08 1 xff09 使用的是普中STM32F103开发板 xff08 2 xff09 keil 5软件 2 目的 点亮开发板上的LED1灯 3 步骤 xff08 1 xff09 定义一系列寄存器的宏 span clas
  • 结构体数组的使用

    测试源码 span class token macro property span class token directive keyword include span span class token string lt stdio h
  • string字符串拼接

    功能描述 实现在字符串末尾拼接字符串 函数原型 xff1a string amp operator 43 61 const char str 重载 43 61 操作符string amp operator 43 61 const char
  • 千万不要在TX2上安装Qt6

    失败 xff01 Nvidia TX2安装Qt6 和qtCreator7 手把手一步步 千万不要想在TX2上安装QT6 xff01 XCB缺失几乎无解 xff0c 如果有大佬可以指导一下 最开始准备使用交叉编译的方案给TX2写程序 因为台式
  • 最新WSL2 ubuntu环境 cuda,教程,适用于40系显卡

    实验环境 xff1a ubuntu2204 ubuntu1804 xff0c 最新4060笔记本电脑 xff0c 自我觉得是目前比较好用的搭配 xff1a wsl2 43 gnome 43 wsl中的pycharm xff0c 写的很全 x
  • 高分辨率机器安装 Ubuntu虚拟机的屏幕显示字体过小问题的解决

    在网上搜索了很多的解决方案 xff0c 有的试了没效果 xff0c 有的比较麻烦 xff0c 没尝试了 我说一下我的解决方案 问题 xff1a 首先我这个机器是2k屏的 xff0c 分辨率就是会大于 1920x1080 xff1b 然后我是
  • IDEA rebuild project idea如何重新编译项目

    idea如何重新编译项目 1 2 3 4 5 6 7 分步阅读 idea工具可以用于多种语言来开发项目 xff0c 如果是像java这样需要编译之后运行的编程语言 xff0c 每次在运行项目之前都需要对源码进行编译 一般的情况下都是idea
  • Ubuntu更新软件时报"http://cn.archive.ubuntu.com/ubuntu"相关错误的解决方案

    一 问题日志 W 仓库 http cn archive ubuntu com ubuntu xenial Release 没有 Release 文件 N 无法认证来自该源的数据 xff0c 所以使用它会带来潜在风险 N 参见 apt sec
  • 《uni-app》一个非canvas的飞机对战小游戏实现-我方飞机实现

    这是一个没有套路的前端博主 xff0c 热衷各种前端向的骚操作 xff0c 经常想到哪就写到哪 xff0c 如果有感兴趣的技术和前端效果可以留言 xff5e 博主看到后会去代替大家踩坑的 xff5e 接下来的几篇都是uni app的小实战

随机推荐