并查集三

【NOJ1593、1594、1595】【并查集三连】朋友敌人关系 1593.并查集(一) 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 一个城市中有n个人,其中一些人是朋友关系,同时他们都认为:朋友的朋友是朋友,现在任给两个人,问他们是否是朋友关系。 输入 先输入两个正整数n和m(均小于1000),表示城市里有n个人,并且将给出m对朋友关系,接下来的m行每行给出两个0~n-1之间的整数,表示这两个人是朋友关系。 最后一行再输... 阅读详情

并查集还有很多要学啊,第一篇文章写的并查集的初始概念然后运用在了图最少还需要修几条路,第二个题是判断图里面这些点有没有形成一个环(里面有并查集的压缩),这个题是


Background 
Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of the opposite gender. In his experiment, individual bugs and their interactions were easy to identify, because numbers were printed on their backs. 

Problem 
Given a list of bug interactions, decide whether the experiment supports his assumption of two genders with no homosexual bugs or if it contains some bug interactions that falsify it. 


Input

The first line of the input contains the number of scenarios. Each scenario starts with one line giving the number of bugs (at least one, and up to 2000) and the number of interactions (up to 1000000) separated by a single space. In the following lines, each interaction is given in the form of two distinct bug numbers separated by a single space. Bugs are numbered consecutively starting from one.
 

Output

The output for every scenario is a line containing "Scenario #i:", where i is the number of the scenario starting at 1, followed by one line saying either "No suspicious bugs found!" if the experiment is consistent with his assumption about the bugs' sexual behavior, or "Suspicious bugs found!" if Professor Hopper's assumption is definitely wrong.
 

Sample Input

2 3 3 1 2 2 3 1 3 4 2 1 2 3 4
 

Sample Output

Scenario #1: Suspicious bugs found! Scenario #2: No suspicious bugs found!


他判断的是这些bugs的交配

http://www.cnblogs.com/dongsheng/archive/2012/08/08/2627917.html

读了这个的文章感觉才慢慢有思路,在原有基础上要有

/*
关于并查集,注意两个概念:按秩合并、路径压缩。
1、按秩合并
由于并查集一般是用比较高效的树形结构来表示的,按秩合并的目的就是防止产生退化的树(也就是类似链表的树),
用一个数组记录各个元素的高度(也有的记录各个元素的孩子的数目,具体看哪种能给解题带来方便),
然后在合并的时候把高度小的嫁接到高度大的上面,从而防止产生退化的树。
2、路径压缩
而另一个数组记录各个元素的祖先,这样就防止一步步地递归查找父亲从而损失的时间。因为并查集只要搞清楚各个元素所在的集合,
而区分不同的集合我们用的是代表元素(也就是树根),所以对于每个元素我们只需保存其祖先,从而区分不同的集合。
而我们这道题并没有使用纯正的并查集算法,而是对其进行了扩展,
我们并没有使用“1、按秩合并”(当然你可以用,那样就需要再开一个数组)
我们从“1、按秩合并”得到启示,保存“秩”的数组保存的是    元素相对于父节点的关系  ,我们岂不可以利用这种关系
(即相对于父节点的不同秩值来区分不同的集合),从而可以把两个集合合并成一个集合。
(注:此代码 relation=0 代表 和父节点同一性别)
*/


#include<stdio.h>
int father[2005];
int relation[2005];

int find_father(int i)
{
    int t;
    if(father[i]==i)
        return i;

    //计算相对于新的父节点(即根)的秩,relation[t]是老的父节点相对于新的父节点(即根)的秩,relation[i]是i元素相对于老的父节点的秩,
    //类似于物理里的相对运动,得到的r[i]就是相对于新的父节点(即根)的秩。而且这个递归调用不会超过两层
    t=father[i];    
    father[i]=find_father(father[i]);
    relation[i]=(relation[i]+relation[t]+1)%2;   //注意递归中把这棵树relation中的的值都更新一遍,这句的顺序 不能 和上一句 调换位置
    // relation[a]的改变是伴随着father[a]的改变而更新的(有father改变就有relation改变),要是father改变了,而relation未改变,此时的relation就记录了一个错误的值,
    //father未改变(即使实际的father已不是现在的值,但只要father未改变,relation的值就是“正确”的,认识到这点很重要。)
    return father[i];
}

void merge(int a,int b)
{
    int x,y;
    x=find_father(a);
    y=find_father(b);
    father[x]=y;
    relation[x]=(relation[b]-relation[a])%2;//relation[a]+relation[x]与relation[b]相对于新的父节点必须相差1个等级,因为他们不是gay
}                                            //x下边的节点不用改,因为查找的时候会自动更新

int main()
{
    int T,m,n,i,j,a,b,flag;
    scanf("%d",&T);
    for(i=1;i<=T;++i)
    {
        flag=0;
        scanf("%d%d",&n,&m);
        for(j=1;j<=n;++j)       //初始化
        {
            father[j]=j;
            relation[j]=1;
        }
        for(j=1;j<=m;++j)
        {
            scanf("%d%d",&a,&b);
            if(find_father(a)==find_father(b))
            {
            //    if(relation[a]!=(relation[b]+1)%2)
                if(relation[a]==relation[b])            //说明是同性
                    flag=1;
            }
            else
                merge(a,b);
        }
        if(flag)
            printf("Scenario #%d:\nSuspicious bugs found!\n\n",i);
        else
            printf("Scenario #%d:\nNo suspicious bugs found!\n\n",i);
    }
    return 0;
}


  ************************

#include<cstdio>  
#include<cstring>  
//using namespace std;  
int f[2023],rank[2023];//rank[]表示0为和根节点是同性,1为和根节点是异性  
void Init(int n)  
{  
    for(int i=0;i<=n+1;i++)  
    {  
        f[i] = i;  
        rank[i] = 0;  
    }  
}  
int work(int x)  
{  
    if(x==f[x])  
        return x;  
    int tem = f[x];  
    int ss = rank[tem];  
    f[x] = work(f[x]);  
    rank[x] = rank[x]^rank[tem];  //rank[tem]是代表x的父亲节点和最新的根节点的关系  
                                    //现在知道了rank[tem]和自己跟父亲的关系即右边的rank[x],  
    return f[x];                //要更新自己跟最新根节点的关系,可知这是异或的关系。  
                        //例如父亲节点跟最新节点是1即是异性,而自己跟父亲节点是0即是同性,  
                        //那自己跟最新节点就是1即是异性。。  
                        //还有三种情况可以自己列出来。。     
}                                     
int main()  
{  
    int n;  
    scanf("%d",&n);  
    int bugnum,ed,x,y;  
    for(int i=1;i<=n;i++)  
    {  
        scanf("%d%d",&bugnum,&ed);  
        Init(bugnum);  
        int re = 0;  
        for(int j=0;j<ed;j++)  
        {  
            scanf("%d%d",&x,&y);  
            if(!re)  
            {  
                int xx = work(x);  
                int yy = work(y);  
                if(xx==yy && rank[x]==rank[y])  
                    re = 1;  
                else  
                {  
                    f[xx] = yy;  
                    rank[xx] = !(rank[x]^rank[y]); //这句话是将两棵树的根节点合起来,那本来两棵树的  
                }                       //根节点的rank[]值都是0,现在要更新xx,即xx成为了yy的子树  
            }                       //那一定要更新rank[xx]的值。本来rank[x]和rank[y]分别为相对xx跟yy  
        }                           //的性别,并且x跟y是新进入的节点,所以他们是异性。  
                                    //所以xx相对于yy的性别为!(rank[x]^rank[y])  
        if(re==1)  
            printf("Scenario #%d:\nSuspicious bugs found!\n\n",i);  
        else  
            printf("Scenario #%d:\nNo suspicious bugs found!\n\n",i);  
    }  
    return 0;  
}  


Lora无线温湿度传感器方案 综上所述,Lora无线温湿度传感器以其长距离传输、低功耗、高稳定性、精准测量、无线传输以及广泛的应用场景等特点,在环境监测领域展现出了强大的竞争力和广泛的应用前景。Lora无线温湿度传感器广泛应用于各种需要远程监控和数据采集的场景,如仓储、农业、机房、楼宇、交通、工业、矿产、电力等领域。Lora无线温湿度传感器是一种采用Lora无线通信技术进行数据传输的温湿度监测设备。四、产品参数(以某款工业级Lora温湿度传感器为例) 阅读详情

相关推荐

ICS v9.5 OverbyteIcsWSocket.pas 整体架构分析

核心架构:OverbyteIcsWSocket.pas 是 Internet Component Suite (ICS) 的基础网络组件单元,提供跨平台 Winsock API 封装,支持TCP/UDP 客户端/服务器,DNS 解析和Raw Socket。在 v9.5 中,SSL/TLS 代码已分离至 OverbyteIcsSslBase.pas 等单元,使核心单元更精简,专注于非加密 socket 操作。

sonadorje的专栏 993

并查集原理及实现--最通俗易懂解释

江湖上散落着各式各样的大侠,有上千个之多。他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架。但大侠们有一个优点就是讲义气,绝对不打自己的朋友。而且他们信奉“朋友的朋友就是我的朋友”,只要是能通过朋友关系串联起来的,不管拐了多少个弯,都认为是自己人。这样一来,江湖上就形成了一个一个的帮派,通过两两之间的朋友关系串联起来。而不在同一个帮派的人,无论如何都无法通过...

Eamon 846

量化人必看|miniQMT踩坑记:回测太慢?一招教你把行情数据“搬回家”!

这篇文章主要聊的是。

奔跑的蜗牛 3476

练习四 1019

概述:有一个物种的一些个体,给出一些数对x,y,表示x和y不是一种性别,然后给出许多数对,问有没有矛盾。 思路:分组并查集,用两个并查集,表示两种性别,然后不断的合并,如果有冲突,就终止,否则就一直合并,最后输出结果。 感想:很有实际意义的问题。 #include #include #include #include using namespace std; const int MA

WiseDoge 564

别再手动折腾了!PICO Unity SDK 一键配置开发环境保姆级教程(含PDC串流调试)

本文详细介绍了PICO Unity SDK的一键配置功能,帮助开发者快速搭建VR开发环境。通过自动化配置流程,大幅减少手动设置时间,提升开发效率。文章还涵盖了PDC串流调试技巧和常见问题解决方案,是PICO VR开发的实用指南。

weixin_30335575的博客 453

ESP32对接百度智能云语音识别:从硬件配置到API调用的完整指南

本文详细介绍了ESP32对接百度智能云语音识别的完整流程,从硬件配置到API调用,涵盖麦克风选择、音频处理、错误处理及性能优化等关键环节。通过实战案例展示如何实现低成本、高效率的语音交互方案,特别适合智能硬件开发者参考。

weixin_29198045的博客 373

专题四1019

题意:给定一系列数对,然后不断的给出这样的数对,问有没有性别不对的情况。 解题思路:并查集的简单应用,就是同性别的合并在一个集合中,然后每次输入看u,v是否在同一个集合中 AC源码         #include     #include     #include     #define N 2005       using namespace std;       i

Lance 351

STM32学习笔记【江科协】【4-2】OLED显示屏

可以注意到接电源的GND和VCC同时和PB6、PB7号口连接,我们可以直接不初始化这两个引脚解决,因为STM32的引脚上电后,如果不初始化,默认是浮空输入的模式,在这个模式下,引脚不会输出电平,所以不会有什么影响,或者直接给PB6口输出低电平,PB7口输出高电平,用GPIO口直接给OLED供电,这个也是没问题的,因为OLED的功率很小这个也是可以驱动的,不过用GPIO口供电不是很规范,实际项目还是用电源供电。然后点击这里放大镜里面带d的图标,进入调试模式,这个界面里,

m0_74651303的博客 1595

并查集详解

并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?) 来看一个实例,杭电1232畅通工程 http://acm.hdu.edu.cn/showproblem.php?pid=1232 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你...

lianxiangbus 1万+

ComfyUI整合包、秋叶ComfyUI、Florence节点报错下载并加载Florence2模型No module named ‘timm.layers‘、ComfyUI报错解决

步骤操作1打开2地址栏输入cmd并回车3输入命令:4安装完成后重新打开 ComfyUI,执行工作流,即可解决报错。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1243

vue3:最新实现腾讯人脸核身+增强版人脸核身使用方法及示例源码,Vue3如何使用腾讯云慧眼人脸核身,提供人脸核身案例、身份信息核验、活体检测与核身比对等示例代码(后端spring与thinkphp)

vue3接入腾讯人脸核身,腾讯云人脸核身Vue3+后端代码,H5人脸核身,vue3 H5如何使用腾讯人脸核身sdk,vue3+thinkphp腾讯人脸核身,Spring Boot接入腾讯云人脸核身教程,hinkphp腾讯人脸核身,vue3人脸核身插件接入流程,vue+spring boot实现腾讯人脸核身,vue3接入腾讯云【增强版人脸核身接入】,vue3 h5微信公众号网页腾讯云慧眼人脸核身,tvue3接入人脸核身SDK,vue3+typescrip+vite接入慧眼实名认证,vue3腾讯云活体人脸核身(

✅ 精选推荐文章 4119

POJ1988 并查集(3)

1 题意 2 分析 3 #include #include #include using namespace std; const int maxn=3e4+10; struct Node{ int all_number; int under_number; int parent;//s.t. bottom }node[maxn]; void Ini()

他的博客 383

ATT MTU 交换机制:提升 BLE 数据传输效率的关键

在低功耗蓝牙(BLE)技术的面试中,ATT MTU 交换机制始终是高频考点。无论是芯片厂商的固件开发岗,还是物联网设备的协议栈调试岗,面试官都爱通过这个知识点考察候选人对 BLE 数据传输底层逻辑的理解。本文将系统梳理核心考点,结合历年真题详解应答思路,轻松应对这类问题。​

byte轻骑兵的技术小窝 2411

种类并查集(双种类,三种类)

关键点在于merge(合并操作)具体说来,与朴素并查集不同的是,种类并查集merge的时候要去单独处理种类的关系。

小虾米的博客 917

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

算法笔记【三】并查集

算法学习笔记【三】并查集

weixin_46100927的博客 350

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【图论】(三)图论的并查集问题

整理总结图论中的并查集问题理论基础与实际的应用

weixin_46216674的博客 1330

并查集算法(三):按秩合并

本文深入解析了并查集算法中的按秩合并优化技术。文章首先回顾了并查集的基本操作和实现方式,包括查找、合并操作及其时间复杂度。重点阐述了按秩合并的原理及作用:通过将较小树合并到较大树下控制树高度,将时间复杂度从O(n)优化至接近常数的O(α(n))。文章提供了详细的Java实现代码,包含路径压缩和按秩合并的具体实现,并通过性能对比表直观展示优化效果。最后总结按秩合并对提升并查集效率的重要性,为读者提供了理解并应用该技术的实用指导。

一碗黄焖鸡三碗米饭的博客 1579

刀开关矩阵结构设计详解:从多路切换到可靠隔离

在配电与检修场景中,机械开关提供的“明显断开点”是电气安全的核心保障。刀开关通过可见的空气间隙实现可靠隔离,这一特性是半导体开关难以替代的。当系统面临多路电源对多路负载的切换需求时,由刀开关按行列拓扑组成的矩阵结构,能够在功能灵活性与操作安全之间取得平衡。其触点性能取决于接触压力与接触电阻的协同,而三相联动机构的精度则直接决定了同步合分闸的可靠性。在实验室配电、备用电源投切等场景中,刀开关矩阵凭借大热容量与短路耐受能力,依然是工程中的优选方案。本文从结构拆解视角,探讨极数选型、母排布局、材料镀层以及安装调试

weixin_33778544的博客 373

并查集的经典例题(三)

题目:营救 题目描述 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了 t 区,而自己在 s 区。该市有 m 条大道连接 n 个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从 s 至 t 的路线,使得经过道路的拥挤度最大值最小。 输入格式 第一行有四个用空格隔开的 n,m,s,t,其含义见【题目描述】。接下来 m 行,每行三个整数 u,v,w,表示有一条大道连接区 u 和区 v,且

aduanzz的博客 707

每日leetcode(三) 并查集

Leetcode原题: 给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。 只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。 示例 1: 输入:["a==b","b!=a"] 输出:false 解释:如果我们指定,a = 1 且 b = 1,那么可以满足第一个方程,但无法满足第二个

qq_42035274的博客 270

专题三图论并查集

并查集

lmb_f的博客 94

GDUT_专题三 A - 并查集

GDUT_专题三 A - 并查集

Hqwq_的博客 130

数据结构(三)并查集

用途 合并两个集合 询问两个元素是否在一个集合中 原理 1.用树来维护每一个集合 示例 一共有n个数,编号是1~n,最开始每个数各自在一个集合中。 现在要进行m个操作,操作共有两种: “M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作; “Q a b”,询问编号为a和b的两个数是否在同一个集合中; 输入格式 第一行输入整数n和m。...

weixin_41680653的博客 278

并查集——(三)C++ 使用 STL 的 map 实现查并集功能

综述 我们接上一节,https://blog.youkuaiyun.com/justidle/article/details/108846236,继续讨论并查集问题。我们发现使用 C++ 数组实现并查集主要问题有以下几个: 1、元素中不能支持负数。因为 C++ 规定数组的下标不能是负数。 2、代码量相对比较大。实现并查集代码量相对有点大。 使用 map 实现并查集 我们可以使用 STL 的 map 这个数据结构来实现。map 本生就是两个数据的映射关系,天生就具有并查集的特点。而且 map 可以支持负数。

努力中的老周的专栏 4046

三消游戏核心算法:并查集实现高效消除判定与工程实践

在游戏开发中,算法设计与数据结构是构建流畅体验的基石。连通分量分析是处理网格类问题的核心思想,通过将相邻的相同元素识别为同一集合,可以高效解决匹配判定问题。并查集作为一种经典的数据结构,其高效的合并与查询操作,为实时性要求高的游戏逻辑提供了理想的解决方案。在休闲益智游戏,尤其是三消品类中,精准、高效的消除判定直接决定了游戏的操作手感和核心循环的稳定性。本文以消除判别算法为例,深入探讨了如何利用并查集思想,将复杂的形状匹配问题转化为连通分量查找,并详细阐述了其在Cocos Creator等引擎中的集成、性能优

weixin_29010003的博客 298

对并查集的理解<三> hdu 1232 畅通工程

对并查集的理解<三> 下附并查集的基本操作的部分代码: 查找:一: int find(int x) { if(a[x]!=x) return find(a[x]); return x; } 二: int find(int x) { while(a[x]!=x) x=a[x]; return x; } 三: 路径压缩情况下...

108

GDUT寒假训练专题三 A并查集

由于本题数据较大,因此输出的时候采用特殊的输出方式:用 00 或 11 代表每个询问的答案,将每个询问的答案依次从左到右排列,把得到的串视为一个二进制数,输出这个二进制数 mod 998244353mod 998244353 的值。如果 op=0,则表示加入一条连接。,表示点的个数和操作的数目。行每行包括三个整数 op,如果 op=1,则表示查询。思路:并查集模板(要用快读)一行包括一个整数表示答案。

m0_74319106的博客 126
上一篇: HDOJ -1272
下一篇: 最短生成树
徐畅Three
博客等级 码龄11年 0粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值