洛谷P2024食物链——并查集补集的灵活运用
题目: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食物链——并查集补集的灵活运用的更多相关文章
- 种类并查集(洛谷P2024食物链)
题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...
- 洛谷P2024 食物链 [NOI2001] 并查集
正解:并查集 解题报告: 传送门(咕了! 其实没有很难(虽然我是交了三发才过的QAQ 但是一来好久没打并查集了恢复一下智力 二来看着智推里唯一一个蓝就很不爽(,,,虽然做了这题之后又补上了个蓝题QAQ ...
- 洛谷P2024 食物链
挺神奇 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种 ...
- [poj1182]食物链(并查集+补集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64841 Accepted: 19077 Description ...
- 洛谷 [P2024] 食物链
并查集 这是一道比较特殊的并查集,开一个三倍的数组, 1-n保存同类,n-n×2保存猎物,n2~n3保存天敌: #include <iostream> #include <cstdi ...
- 洛谷P3295 萌萌哒 并查集 + ST表
又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...
- 洛谷P2024食物链
传送门啦 这道题的特殊之处在于对于任意一个并查集,只要告诉你某个节点的物种,你就可以知道所有节点对应的物种. 比如一条长为4的链 甲->乙->丙->丁 ,我们知道乙是A物种.那么甲一 ...
- 洛谷P4092树——并查集
题目:https://www.luogu.org/problemnew/show/P4092 利用并查集,倒序离线,那么从倒序来看被撤销标记的点就再也不会被标记,所以用并查集跳过: 莫名其妙的WA,调 ...
- 洛谷P2391 白雪皑皑(并查集)
题目背景 “柴门闻犬吠,风雪夜归人”,冬天,不期而至.千里冰封,万里雪飘.空中刮起了鸭毛大雪.雪花纷纷,降落人间. 美能量星球(pty 在 spore 上的一个殖民地)上的人们被这美景所震撼.但是 p ...
随机推荐
- GenericServlet 、Servlet和httpServler他们之间的关系
1.GenericServlet类是所有Servlet类的祖先类. 2.HttpServlet类继承了GenericServlet类. 3.Servlet有两个非常重要的的对象,可以说是java we ...
- SQL Prompt 编辑
SQL Prompt是一款拥有SQL智能提示功能的SQL Server和VS插件.超级好用的插件,
- FTP匿名登录或弱口令漏洞及服务加固
漏洞描述 FTP 弱口令或匿名登录漏洞,一般指使用 FTP 的用户启用了匿名登录功能,或系统口令的长度太短.复杂度不够.仅包含数字.或仅包含字母等,容易被黑客攻击,发生恶意文件上传或更严重的入侵行为. ...
- PHP网站常见安全漏洞 及相应防范措施总结
一.常见PHP网站安全漏洞 对于PHP的漏洞,目前常见的漏洞有五种.分别是Session文件漏洞.SQL注入漏洞.脚本命令执行漏洞.全局变量漏洞和文件漏洞.这里分别对这些漏洞进行简要的介绍. 1.se ...
- Mysql 免密码登录,修改密码及忘记密码操作
----免密码登陆 方式一 my.cnf增加[client]标签 [client] user="root" password="你的密码" 单对定义不同的客户端 ...
- 【WPF学习笔记】之 System.Exception 对象名 'XXXX' 无效。
我在运行vs时候发现项目报错,如下图: 报Exception错误,对象名“XXXXXX”无效. 经过调查得知,因为连接数据库的库名写错了,如下: 对应正确数据库的库名: 把库名改正确,问题就解决了.
- python 基础 8.0 regex 正则表达式--常用的正则表达式
一. python 中常用的正则表达式 二. 正则表达式的网站,可以进行在线正则匹配 https://regex101.com/ 1. 使用方法及正则介绍 1> ‘.’ 匹 ...
- [转]解析ASP.NET WebForm和Mvc开发的区别
因为以前主要是做WebFrom开发,对MVC开发并没有太深入的了解.自从来到创新工场的新团队后,用的技术都是自己以前没有接触过的,比如:MVC 和EF还有就是WCF,压力一直很大.在很多问题都是不清楚 ...
- 怎么查看自己的IP地址?
https://jingyan.baidu.com/article/63f2362816d56c0208ab3dd5.html 1.通过自己的电脑查看的是内部局域网的IP地址 2.通过网上查看的IP地 ...
- 九度OJ 1048:判断三角形类型 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6794 解决:3361 题目描述: 给定三角形的三条边,a,b,c.判断该三角形类型. 输入: 测试数据有多组,每组输入三角形的三条边. 输 ...