您的位置:首页 > 其它

POJ 1703 Find them, Catch them

2013-11-26 09:47 281 查看
题意:罪犯有两个帮派,有两种命令,D a b,a,b表示罪犯的编号,这句话表示a和b来自不同的帮派。A a b,a,b表示罪犯的编号,这句话是问你a和b是否来自同一个帮派,可以有三种回答,“目前不确定“,”是“,”不是“。罪犯最多10^5个,命令最多10^5个。

解法:并查集基础题。用一个struct node表示每一个罪犯,node.f表示该罪犯的父亲节点,node.r表示该罪犯与父亲节点对应的罪犯的关系(0表示来自同一个帮派,1表示不同)。然后写find函数注意更新node.r就行。具体见代码吧。

Ps:另外,本题是POJ 1182的简化版,题解见POJ 1182 食物链

tag:并查集

/*
* Author:  Plumrain
* Created Time:  2013-11-26 09:19
* File Name: G-POJ-1703.cpp
*/
#include <iostream>
#include <cstdio>

using namespace std;

const int maxn = 100005;

struct node{
int f, r;
};

char s[10];
int n, m;
node a[maxn];

void init()
{
for (int i = 0; i < n; ++ i){
a[i].f = i;
a[i].r = 0;
}
}

int find(int x)
{
if (x == a[x].f){
a[x].r = 0;
return x;
}

int y = a[x].f;
a[x].f = find(a[x].f);
a[x].r = (a[y].r + a[x].r) % 2;
return a[x].f;
}

void merge(int x, int y)
{
int t1 = find(x), t2 = find(y);
a[t1].f = t2;
a[t1].r = (a[y].r + a[x].r + 1) % 2;
}

int main()
{
int T;
scanf ("%d", &T);
while (T --){
scanf ("%d%d", &n, &m);
init();

int x, y;
while (m --){
scanf ("%s%d%d", s, &x, &y);
int t1 = find(x), t2 = find(y);
if (s[0] == 'D')
merge(x, y);
else{
if (t1 != t2)
printf ("Not sure yet.\n");
else{
if (a[x].r == a[y].r)
printf ("In the same gang.\n");
else
printf ("In different gangs.\n");
}
}
}
}
return 0;
}


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