题目: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. hdu 1068 Girls and Boys 二分图的最大匹配

    题目链接:pid=1068">http://acm.hdu.edu.cn/showproblem.php? pid=1068 #include <iostream> #in ...

  2. eval(function(p,a,c,k,e,d){e=function(c)加解密

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. javascript调试常用工具讲解

    .Console命令详解,让调试js代码变得更简单 2.<Firebug入门指南>

  4. 玩转 eclipse:[1]如何快速找错-debug

    本文摘自百度经验 原文地址如下: 玩转 eclipse:[1]如何快速找错-debu eclipse是软件开发人员必备的IDE之一. 由于语言障碍或者是经验不足,许多刚刚新手并不清楚如何高效使用ecl ...

  5. POJ2407_Relatives【欧拉phi函数】【基本】

    Relatives Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11422 Accepted: 5571 Descriptio ...

  6. phpmyadmin内存溢出

    phpmyadmin Fatal error: Allowed memory size of 134217728 bytes 解决方法: 在报错的页面里,加上这句: ini_set('memory_l ...

  7. Android 自定义View跑马灯效果(一)

    今天通过书籍重新复习了一遍自定义VIew,为了加强自己的学习,我把它写在博客里面,有兴趣的可以看一下,相互学习共同进步: 通过自定义一个跑马灯效果,来诠释一下简单的效果: 一.创建一个类继承View, ...

  8. Sqlite 设置外键级联更新

    Sqlite 设置外键级联更新 选择好外键表和列以后,勾选更新事件,更新方式设置为CASCADE,即可在外键更新时自动更新

  9. POJ2594 Treasure Exploration[DAG的最小可相交路径覆盖]

    Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8301   Accepted: 3 ...

  10. MongoDB API java的使用

    1.创建一个MongoDB数据库连接对象,它默认连接到当前机器的localhost地址,端口是27017. Mongo mongo=new Mongo(); 2.获得与某个数据库(例如“test”)的 ...