您的位置:首页 > Web前端 > JavaScript

DisJSet:Find them, Catch them(POJ 1703)

2015-11-04 00:34 671 查看
                


                 抓住他们!

  题目大意:两个黑社会帮派,互相打架,现在你很多条信息,要你确定两个人是否属于不同帮派

  这题很有趣,题目不是直接给你两个人是否是一个帮派的,他给你的是不同帮派的,也就是给你很多个不同的要你找相同的。

  乍看很麻烦,但是还记得我以前发布过一个食物链的题解吗!

  食物链要求维护三个不同关系的集合,我第二种方法用的是偏移集!只用两个集合就搞定问题了。

  这一题比食物链更简单,他只用维护两个就可以了。

  

#include <iostream>
#include <functional>
#include <algorithm>
#define MAX 100005

using namespace std;
typedef int Position;

static int Set[MAX];
static int delta[MAX];

Position Find(Position);
void Unite_Set(Position, Position);
void Test(Position, Position);

int main(void)
{
int case_sum, n, message_sum, tmp_x, tmp_y;
char choice;
scanf("%d", &case_sum);
while (case_sum--)
{
scanf("%d%d", &n, &message_sum);
getchar();
for (int i = 1; i <= n; i++)
Set[i] = i;
memset(delta, 0, sizeof(delta));
for (int i = 0; i < message_sum; i++)
{
scanf("%c", &choice);
scanf("%d%d", &tmp_x, &tmp_y);
if (choice == 'D')
Unite_Set(tmp_x, tmp_y);
else
Test(tmp_x, tmp_y);
getchar();//消除回车
}
}
return 0;
}

void Test(Position x, Position y)
{
Position px, py;
px = Find(x); py = Find(y);
if (px == py)
{
if ((delta[x] - delta[y] + 2) % 2 == 0)
puts("In the same gang.");
else
puts("In different gangs.");
return ;
}
puts("Not sure yet.");
}

Position Find(Position x)
{
Position tmp;
if (Set[x] == x)
return x;
tmp = Find(Set[x]);

delta[x] = (delta[x] + delta[Set[x]]) % 2;
Set[x] = tmp;
return tmp;
}

void Unite_Set(Position x, Position y)
{
Position px, py;
px = Find(x); py = Find(y);
if (px != py)
{
Set[py] = px;
delta[py] = (delta[x] - delta[y] + 1 + 2) % 2;
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: