题目:https://www.luogu.org/problemnew/show/P2024

自己在做本题时最大的障碍就是:不会在一个集合的father改变时把相应的补集也跟着改变。

借鉴题解后,才明白原来就是把其补集也进行合并;由于fa数组在改变,不要定义一个变量为原来的find()在后面使用。

原来的乱七八糟代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n,k,s;
int fa[2000005];
int find(int x)
{
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
int main()
{
scanf("%d%d",&n,&k);
// for(int i=1;i<=n;i++)
// fa[i]=i;
int a,b,c;
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(b>n||c>n)
{
s++;continue;
}
if(a==1)
{
if(!fa[b])
{
if(!fa[c])
fa[b]=b,fa[c]=b;
else fa[b]=c;
}
else if(!fa[c])fa[c]=b;
else
{
int u=find(b);
int v=find(c);
if(u==find(v+n)||u==find(v+2*n)||
v==find(u+2*n)||v==find(u+n))s++;
else fa[u]=v;
}
}
if(a==2)
{
if(b==c)
{
s++;continue;
}
if(!fa[b])fa[b]=b;
if(!fa[c])fa[c]=c;
int u=find(b);
int v=find(c);
if(u==v||u==find(v+n)||v==find(u+2*n))s++;
else fa[v]==u+n,fa[u]=v+2*n;
}
}
printf("%d",s);
return 0;
}

  改进后的代码(AC):

#include<iostream>
#include<cstdio>
using namespace std;
int n,k,s;
int fa[2000005];
int find(int x)
{
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n*3;i++)//!!
fa[i]=i;
int a,b,c;
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(b>n||c>n)
{
s++;continue;
}
if(a==1)
{
// int u=find(b);
// int v=find(c);
if(find(b)==find(c+n)||find(b+n)==find(c))s++;
else
// fa[b]=c;
{
fa[find(b)]=fa[find(c)];//!!!
fa[find(b+n)]=fa[find(c+n)];//!!!
fa[find(b+2*n)]=fa[find(c+2*n)];//!!!
}
}
if(a==2)
{
// int u=find(b);
// int v=find(c);
if(b==c||find(b)==find(c)||(find(c+n)==find(b)))s++;
else
// fa[b+n]=c,fa[c+2*n]=b;
{
fa[find(b+n)]=fa[find(c)];//!!!
fa[find(c+2*n)]=fa[find(b)];//!!!
fa[find(b+2*n)]=fa[find(c+n)];//!!!
}
}
// for(int i=1;i<=n;i++)
// printf("fa[%d]=%d ",i,fa[i]);
// cout<<endl;
}
printf("%d",s);
return 0;
}
/*
4 5
1 1 3
2 2 4
2 3 2
1 1 4
2 2 3 2
*/

  

洛谷P2024食物链——并查集补集的灵活运用的更多相关文章

  1. 种类并查集(洛谷P2024食物链)

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  2. 洛谷P2024 食物链 [NOI2001] 并查集

    正解:并查集 解题报告: 传送门(咕了! 其实没有很难(虽然我是交了三发才过的QAQ 但是一来好久没打并查集了恢复一下智力 二来看着智推里唯一一个蓝就很不爽(,,,虽然做了这题之后又补上了个蓝题QAQ ...

  3. 洛谷P2024 食物链

    挺神奇 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种 ...

  4. [poj1182]食物链(并查集+补集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64841   Accepted: 19077 Description ...

  5. 洛谷 [P2024] 食物链

    并查集 这是一道比较特殊的并查集,开一个三倍的数组, 1-n保存同类,n-n×2保存猎物,n2~n3保存天敌: #include <iostream> #include <cstdi ...

  6. 洛谷P3295 萌萌哒 并查集 + ST表

    又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...

  7. 洛谷P2024食物链

    传送门啦 这道题的特殊之处在于对于任意一个并查集,只要告诉你某个节点的物种,你就可以知道所有节点对应的物种. 比如一条长为4的链 甲->乙->丙->丁 ,我们知道乙是A物种.那么甲一 ...

  8. 洛谷P4092树——并查集

    题目:https://www.luogu.org/problemnew/show/P4092 利用并查集,倒序离线,那么从倒序来看被撤销标记的点就再也不会被标记,所以用并查集跳过: 莫名其妙的WA,调 ...

  9. 洛谷P2391 白雪皑皑(并查集)

    题目背景 “柴门闻犬吠,风雪夜归人”,冬天,不期而至.千里冰封,万里雪飘.空中刮起了鸭毛大雪.雪花纷纷,降落人间. 美能量星球(pty 在 spore 上的一个殖民地)上的人们被这美景所震撼.但是 p ...

随机推荐

  1. Bootstrap学习速查表(一) 理论基础

    参考网站http://www.bootcss.com/ 第一步,起步,引入基本样式 <!-- 新 Bootstrap 核心 CSS 文件 --> <link rel="st ...

  2. FullPage.js 活动单页 - 全屏滚动插件

    插件描述:fullPage.js 是一个基于 jQuery 的插件,它能够很方便.很轻松的制作出全屏网站. https://www.uedsc.com/fullpage.html 官网 如今我们经常能 ...

  3. Dell 刀片服务器CentOS6.5mini开机20~30分钟宕机

    今天查看系统日志发现大量的nf_conntrack: table full, dropping packet. 错误 cat /var/log/messages | moreJun  7 09:52: ...

  4. ReactiveCocoa入门教程——第二部分【转载】

    ReactiveCocoa是一个框架,它能让你在iOS应用中使用函数响应式编程(FRP)技术.在本系列教程的第一部分中,你学到了如何将标准的动作与事件处理逻辑替换为发送事件流的信号.你还学到了如何转换 ...

  5. centOS解决乱码问题

    问题描述:输入javac出现乱码,部分字符不能显示解决方法 echo 'export LANG=en_US.UTF-8' >> ~/.bashrc

  6. java8笔记: sorted()之正序倒序

    java8笔记: sorted()之正序倒序 这篇文章将会讲解Java 8 Stream sorted()示例 下面代码以自然序排序一个list List<Person> listTem ...

  7. 20-ab压力测试及nginx性能统计模块

    一:找到apache ab模块. ab -c 1000 -n 50000 http://127.0.0.1/index.html 查看信息: 超过1024个线程 出现错误,说打开文件太多了.cket: ...

  8. 在diy的文件系统上创建文件的流程

    [0]README 0.1) source code are from orange's implemention of a os , and for complete code , please v ...

  9. centOS7 安装nginx+php+mysql

    nginx安装 本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好. 安装make: yum -y install gcc automa ...

  10. SQL ROW_NUMBER() 分页使用示例

    ALTER PROC [dbo].[TestProPage] , AS BEGIN SELECT * FROM (SELECT *,ROW_NUMBER() OVER(ORDER BY IndexID ...