题目链接:http://poj.org/problem?id=1703

这道题和食物链那道题有异曲同工之处,都是要处理不同集合之间的关系,而并查集的功能是维护相同集合之间的关系。这道题中有两个不同的集合,朴素并查集只能查询两者是否属于同一个集合,扩展并查集可以建立多个集合之间的关系。

本题我看了很多博客,对于两个集合,有许多博客都是采取2*n大小的并查集解决。大家的说法都是1-n属于一个集合,n-2*n属于另一个集合,我看的云里雾里,下面我想用我的方法来证明这样划分两个集合的正确性。

证明:我们人为上的操作既然不会将k和n+k结点合并就说明k结点和n+k结点永远也不会在同一个集合中,我们可以认为(k,n+k)是一组对立元组,我们要将(a,b)元组中的a和b归到不同的集合中去,由于(a,n+a)和(b,n+b)一定是对立的元组,现在我们要制造(a,b)是对立元组的局面,我们可以知道(a,n+b)属于同一个集合和(a+n,b)属于同一个集合。现在不用管两个到底具体属于哪个集合,只要知道他们是属于不同的集合,所以只要将(a,n+b)合并还有(a+n,b)合并就可以保证(a,b)是对立元组。查询时也只要看(a,b)是否属于同一个集合。证毕。

根据我的证明,大家应该对基础的种类并查集有了一点认识。代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
const int maxn = 1e5 + ; int n, m;
int par[maxn*], high[maxn*]; void init(int n)
{
for(int i = ; i <= n; i++)
{
par[i] = i;
high[i] = ;
}
} int getRoot(int x)
{
return par[x] == x ? x : par[x] = getRoot(par[x]);
} void unite(int x, int y)
{
x = getRoot(x);
y = getRoot(y);
if(x == y) return; if(high[x] < high[y]) par[x] = y;
else
{
par[y] = x;
if(high[x] == high[y]) high[x]++;
}
} bool same(int x, int y)
{
return getRoot(x) == getRoot(y);
} int main()
{
//freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
init(*n); char op; int a, b;
for(int i = ; i <= m; i++)
{
scanf("\n%c%d%d", &op, &a, &b);
if(op == 'D')
{
unite(a, b+n);
unite(a+n, b);
}
else
{
if(same(a, b+n) || same(a+n, b)) printf("In different gangs.\n");
else if(same(a, b) || same(a+n, b+n)) printf("In the same gang.\n");
else printf("Not sure yet.\n");
}
}
}
return ;
}

最新文章

  1. laravel安装笔记
  2. Xcode开发中 Code Snippets Library 的相关用法
  3. asp.net ajax控件tab扩展,极品啊,秒杀其它插件
  4. QPS/QPS/PV/UV/服务器数量/并发数/吐吞量/响应时间计算公式
  5. 文件系统:Ext3和Ext4
  6. leetcode&mdash;Populating Next Right Pointers in Each Node
  7. 在navigationItem中添加搜索栏
  8. Strtus2 S2-045漏洞
  9. java中String s = new String(&quot;abc&quot;)创建了几个对象?
  10. pandas教程1:pandas数据结构入门
  11. Http get方式url参数长度以及大小
  12. C#学习笔记---C#操作SQL数据库
  13. Django forms表单 select下拉框的传值
  14. puppeteer(二)操作实例——新Web自动化工具更轻巧更简单
  15. es6中...是什么意思。
  16. Asp.net webform scaffolding结合Generic Unit of Work &amp; (Extensible) Repositories Framework代码生成向导
  17. Windows 7系统下安装和卸载删除IE的方法
  18. Go语言学习之8 goroutine详解、定时器与单元测试
  19. opencv 学习总结 方法总结
  20. Android App组件之Fragment说明和示例

热门文章

  1. DZNEmptyDataSet的使用
  2. windows7 64位系统下无法运行ipython
  3. nginx 502排错
  4. 微信小程序app.js中设置公有变量
  5. TCP 可靠传输与流量控制的实现
  6. 【ThinkPHP6:从TP3升级到放弃】1. 前言及准备工作
  7. Spring编译后没有xml配置文件解决方法
  8. 从头认识js-基本概念(关键字,保留字,数据类型)
  9. 7-12 产生每位数字相同的n位数 (30 分)
  10. 使用VMware12在CentOS7上部署docker实例