题目: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. js 中的 prototype 和 constructor

    var a=function(){ this.msg="aa"; } a.prototype.say=function(){ alert('this is say');} 1.只有 ...

  2. 计算机器内存数量+引入和显示ARDS成员

    [1]README 1.1) 本代码在于读取内存中多个 内存段的地址范围描述符结构体(ARDS),有多少个内存段可以用: 1.2) source code and images in the blog ...

  3. 高速修复汉澳sinox命令解释程序bash shell漏洞

    bash是linux默认命令行管理程序shell.汉澳 sinox也安装有,尽管sinox并没有默认使用bash.可是用户一旦使用就会可能被通过漏洞入侵,所以必须高速修复.尽管sinox使用freeb ...

  4. Refused to set unsafe header

    Refused to set unsafe header Refused to set unsafe header "Host"waitServerDeal @ tGet.html ...

  5. Webpack探索【16】--- 懒加载构建原理详解(模块如何被组建&如何加载)&源码解读

    本文主要说明Webpack懒加载构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack懒加载构建原理. 本文使用的 ...

  6. mysql 创建用户与授权

    权限管理 我们都知道,最高权限管理者是 root 用户 , 它拥有着最高的权限操作,包括 : select(查询) ,update(修改) , delete(删除,有事没事都不要用这个,反正也不能给这 ...

  7. 【Leetcode-easy】Roman to Integer

    罗马数字转化为整数 * 1.基本数字 Ⅰ.X .C 中的任何一个.自身连用构成数目.或者放在大数的右边连用构成数目.都不能超过三个:放在大数的左边只能用一个: * 2.不能把基本数字 V .L .D ...

  8. HTML5模拟衣服撕扯效果

    在线演示 本地下载

  9. BZOJ 1673 [Usaco2005 Dec]Scales 天平:dfs 启发式搜索 A*搜索

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1673 题意: 有n个砝码(n <= 1000),重量为w[i]. 你要从中选择一些砝 ...

  10. 分享知识-快乐自己:什么是MVC

    1.什么是mvc: Model View Controller,是模型-视图-控制器的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里,在改进和个性 ...