POJ 1703 Find them, Catch them 种类并查集

题意

给出一堆点和关系
D为两点不同集合
A为查询两点是否不同集合
n<=1e5

code

#include<cstdio>
#include<iostream>
#include<algorithm>using namespace std;
const int maxn = 1e5+7;
int f[maxn],rel[maxn];//rel为0表示与父节点不同类 1为同类
int find(int x){int t;if(f[x]==x)return x;t = find(f[x]);rel[x] = (rel[x]+rel[f[x]]+1)%2;//当前节点与旧父节点之间的关系、父节点与根节点的关系 可以判断出 当前节点和根节点的关系 即所谓的关系运算 模拟现实中的关系判断 return f[x] = t;//如果这里面总是保存的与父节点的关系 我们没法通过两个不同的节点判断他俩的关系 但我们如果知道两个不同的节点与根节点的关系 就可以判断两个节点之间的关系 
}//当我们需要判断两个点的关系时 我们需要知道两个节点对一个相同的节点的关系 才能判断出当前两个节点的关系 
int main()
{int t;scanf("%d",&t);while(t--){int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)f[i] = i,rel[i] = 1;while(m--){char o[4];int a,b;scanf("%s%d%d",o,&a,&b);int fa = find(a);int fb = find(b);if(o[0]=='A'){if(fa==fb){if(rel[a]==rel[b])puts("In the same gang.");else puts("In different gangs.");//与根节点关系不同 那么一定不同集 } else puts("Not sure yet.");}else {//只要有关系 就给他们连到一起 不管什么关系 我们都可以用rel数组记录他们分别于根节点的关系 那么我们如何判断这两个点的关系 就可以通过他们分别对根节点的关系来做出来 f[fa] = fb;rel[fa] = (rel[a]+rel[b])%2;}}}return 0;
}

分析

种类并查集
当我们判断两个点的关系时 我们如何判断呢
基础的并查集知识告诉我们 我们可以判断这两个点是否在一个联通块中 这两个点是否是一个集合
现在关系复杂了 两个元素可以是一个集合的也可以是不同集合的 我们如何判断呢
假设我们记录下每个节点与父节点的关系
那么当我们查询两个节点时
我们都知道他们与父节点的关系
我们也知道他们的根节点是谁
if 两个节点是不同集合的 那么我们如何判断出来呢

仅凭两个父节点貌似不好判断
假如每一个关系都建立一个独立的树
由于数据并不是按照相同关系给我们的
而是按照不同或相同关系给我们的
那么我们就需要递推两个元素的关系
假如 a-b不同 b-c不同 那么a-c相同 我们需要判断出来
这里就需要种类并查集来做
假如当我们查询 ac的关系的时候 如果我们都知道 a和c与另外一个节点的关系
那么我们就能判断出来ac的关系 通过两个变量与共同的第三方变量的关系
于是种类并查集规定
我们维护每个点和父节点的关系 但最终我们实质维护的是每个节点与 根节点的关系!
假如所有出现的两个点都在一棵树里 没出现的点 我们不必管
我们只需要去维护每个点与根节点的关系 我们就可以推出两个节点的相互关系
如何实现这个关系 就是利用关系数量取余操作
因为这里的关系 并不是每个集合一个独立的树 独立的树 我们无法判断交叉关系假如 a在一个树上 b在另一颗树上 那么c如何连到与b不同的那棵树呢?可以维护两个集合 只不过有些时候我们的关系不止是两层 有时关系会变成多层 那么就不好维护两个集合了

话说种类并查集有没有迭代的写法?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018java最新面试题

java面试题连接地址 https://blog.csdn.net/qq_41701956/article/details/80250226 https://juejin.im/post/5aacad4551882555642bd1b0 https://juejin.im/post/5ab1a338518825558a067c1f https://juejin.im/entry/5c6aba00e51d45719047035e转载于:https://www.cnblogs.com/liu…

45请求转发和请求重定向区别

请求转发 定义一个response的jsp文件 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8" import"java.util.*,java.io.*"%> <%out.println("<h1>response内置对象</h1>&qu…

[签名算法]DSA 算法

DSA&#xff08;Digital Signature Algorithm&#xff09;是Schnorr和ElGamal签名算法的变种&#xff0c;被美国NIST作为DSS(DigitalSignature Standard)。 DSA是基于整数有限域离散对数难题的。 DSA是一种更高级的验证方式。一般用于数字签名和认证。DSA 不单单只有公钥、私钥…

Mahmoud and a Dictionary CodeForces - 766D 种类并查集

题意 给出多个字符串 然后再输入多个字符串之间的关系 让我们判断这其中是否存在矛盾的关系 有矛盾输出NO 没矛盾输出 YES 然后再输入多个询问 每个询问 两个字符串 让我们判断其中的关系 同义词输出1 反义词输出2 不确定输出3 分析 种类并查集 如果两个字符串的关系 是1 …

几位大佬启蒙老师和女神启蒙老师的博客,大家可以多关注下

Eva_J女神&#xff1a;https://www.cnblogs.com/Eva-J/ 太白金星&#xff1a;http://www.cnblogs.com/jin-xin/articles/7562422.html 金角大王等待唐僧的日子&#xff1a;https://www.cnblogs.com/alex3714/articles/5465198.html Mr.Seven 大佬&#xff1a;http://www.cnblog…

[Leetcode][第63题][JAVA][不同路径2][动态规划][压缩路径]

【问题描述】[中等] 【解答思路】 1. 动态规划流程 第 1 步&#xff1a;设计状态 第 2 步&#xff1a;状态转移方程 第 3 步&#xff1a;考虑初始化 第一行第一列 没有遇到“障碍” 就为1 如果u&#xff08;i&#xff0c;j&#xff09;0 直接返回 0 第 4 步&#xff1a;考虑…

47session 方法

定义一个page1 <% page language"java" import"java.util.*,java.text.*" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"utf-8"&…

Wincc V7.3SE安装截图

打开某个工程出错,能力所限,找不到问题,没能解决 转载于:https://www.cnblogs.com/guyk/p/10555965.html

[剑指offer]面试题第[57-2]题[JAVA][和为s的连续正数序列][数学法][滑动窗口]

【问题描述】[简单] 【解答思路】 1. 滑动窗口 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) public int[][] findContinuousSequence(int target) {int i 1; // 滑动窗口的左边界int j 1; // 滑动窗口的右边界int sum 0; // 滑动窗口中数字的和List<int[]&…

[Leetcode][第112题][JAVA][路径总和][递归][队列]

【问题描述】[中等] 【解答思路】 1. 递归 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(H) 从根节点开始&#xff0c;每当遇到一个节点的时候&#xff0c;从目标值里扣除节点值&#xff0c;一直到叶子节点判断目标值是不是被扣完。 class Solution {public boolean…

波动基因

突发奇想&#xff0c;会不会在癌症不同阶段中&#xff0c;同一个基因呈现出多峰的waving状态&#xff0c;这样的基因会不会在癌症阶段的转变中起着作用。 一个小想法&#xff0c;有空了做一下试试&#xff0c;现在暂时确定一下用信息熵来度量waving状态的程度。 坑越挖越多&…

[项目经验]玩转开源项目

搞懂一个开源项目的几大步骤 细看四大模块 1.首先正式开始啃开源项目之前&#xff0c;基础不可少&#xff0c;比如语言底子、网络协议、基本工具、基本应用框架、甚至包括一些设计模式等等&#xff0c;否则人家开源项目很难下牙。 2.正式看一个开源项目时&#xff0c;首先可以全…

Hihocoder #1631 : Cats and Fish 模拟

题意 现有n个鱼 m个猫 每条猫有吃一条鱼所要花去的时间 问最终x分钟后会有多少只完整的鱼 和不完整的鱼 分析 很像操作系统的资源调度的问题 这种卡时间点的问题向来都要好好把 每个步骤所发生的时间给他具体化 我们看每只猫吃一条鱼花去ci分钟 而他是在这一分钟开始的时…

49session的生命周期实例

通过超链接打开的是同一会话 定义一个page1 <% page language"java" import"java.util.*,java.text.*" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <me…

安卓——launchMode

网上的实在看不懂&#xff0c;在这里姑且记录下自己理解了的。 android:launchMode"" 设置Activity的启动模式 standard 每次都会启动一个新的Activity singleTop 会扫描内存栈以保证不会重复创建Activity singleTack 一样会扫描但会移除该Activity之后的全部实例…

[Leetcode]第[58]题[JAVA][最后一个单词的长度][字符串]

【问题描述】[简单] 【解答思路】 直接定位最后一个单词 先找最后一个单词最后一个字母 再找最后一个单词第一个字母 1. 常规做法 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) class Solution {public int lengthOfLastWord(String s) {int end s.length() …

The 2014 ACM-ICPC BeiJing D - Dire Wolf HDU - 5115 区间dp

题意 n个狼 排成一排 我们要把一排狼都删除掉 删除一个狼的花费是这个狼的权值和左右两个狼的附加值 求最小花费 分析 考虑区间dp dp[i][j]表示i到j的最小花费 我们可以枚举其中的k 为序列中最后一个删除的元素 然后记忆话搜索 这样下来最深层次的元素最先删除 附加元素…

50session的销毁会话和超时管理

定义一个page1 <% page language"java" import"java.util.*,java.text.*" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"utf-8"&…