一、题面

POJ1703

二、分析

需要将并查集与矢量法则相结合。par数组用以记录父节点,rank用以记录与父节点的关系。如题意,有两种关系,设定0是属于同一个帮派,1表示不属于同一个帮派。

运用并查集的时候判断x,y时考虑几种情况:

1.x与y父节点不相同:此时为不清楚两者关系。

2.x与y父节点相同,rank的值也相同:两者属于同一帮派。

3.x与y父节点相同,rank的值不相同:两者不属于同一帮派。

要得到这个关系,需要在并查集的find函数内对各个点的rank和par的值进行不断的更新。

对于rank,需要使用矢量加法,如

$\overrightarrow{AB}+\overrightarrow {BC}=\overrightarrow {AC}$

结合题目就是例:x的父节点px,如果x与父节点的关系是rank[x],px与父节点的关系是rank[px],那么x与par[px]的关系就是

$(rank[x] + rank[px])\%2$

其他的推理类似。

在find的路径压缩时,注意把rank关系进行更新即可,在union时涉及到x,y与它们的父节点px,py的rank值更新,其实原理相同。

三、AC代码

 #include <cstdio>
#include <iostream>
#include <fstream> using namespace std; const int MAXN = 1e5+;
int par[MAXN];
int Rank[MAXN]; void init()
{
for(int i = ; i < MAXN; i++)
{
par[i] = i;
Rank[i] = ;
}
} int find(int x)
{
if(par[x] == x)
return x;
int px = par[x];
par[x] = find(par[x]);
Rank[x] = (Rank[px]+Rank[x])%;
return par[x];
} void Union(int x, int y)
{
int px = find(x);
int py = find(y);
if(px == py)
return;
par[px] = py;
Rank[px] = (Rank[x]++Rank[y])%;
} int main()
{
//freopen("input.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int T, M, N, x, y;
char op; while(scanf("%d", &T)!=EOF)
{ while(T--)
{
init();
scanf("%d %d", &N, &M);
for(int i = ; i < M; i++)
{
getchar();
scanf("%c %d %d", &op, &x, &y);
if(op == 'A')
{
int px = find(x);
int py = find(y);
if(px != py)
{
puts("Not sure yet.");
}
else
{
if(Rank[x] == Rank[y])
puts("In the same gang.");
else
puts("In different gangs.");
}
}
else
{
Union(x, y);
}
}
}
}
return ;
}

最新文章

  1. AJAX请求详解 同步异步 GET和POST
  2. KnockoutJS 3.X API 第四章(14) 绑定语法细节
  3. Genesis 2.8-2.12
  4. URL详谈
  5. C# 输出pdf文件流在页面上显示
  6. WPF 使用定时器
  7. HDU 5387 Clock
  8. winform 窗体关闭按钮禁用、不显示最大化、最小化、关闭按钮 分类: WinForm 2014-12-22 16:09 82人阅读 评论(0) 收藏
  9. Visual c++例子,可不使用常规的对话框资源模板的情况下,动态创建对话框的方法
  10. [置顶] android网络通讯之HttpClient4不指定参数名发送Post
  11. ASP.NET MVC Boilerplate简介
  12. 一个简单的dom查询函数
  13. JAVA_SE基础——4.path的临时配置&Classpath的配置
  14. web框架开发-Django的Forms组件
  15. 图片万能居中css
  16. EF(EntityFramework) 插入或更新数据报错
  17. knockoutjs关于ko.bindingHandlers的updata订阅
  18. 【php】thinkphp以post方式查询时分页失效的解决方法
  19. iOS - 栈顶VC控制器的获取
  20. LA 3486 Cells(判祖先+栈模拟dfs)

热门文章

  1. DEDE 5.7中各函数所在的文件和位置
  2. c语言学习笔记 break语句
  3. html5 存储方式
  4. Row_Number() OVER()函数使用举例
  5. .Net 数据库(SqlServer2008)的备份、还原
  6. 解决linux下80端口占用问题
  7. APP压力稳定性测试
  8. LibreOJ 6001 太空飞行计划(最大流)
  9. adb命令安装及卸载应用
  10. Redis 占用Windows系统盘空间23G