POJ1703带权并查集(距离或者异或)
来源:互联网 发布:yii2框架源码分析 编辑:程序博客网 时间:2024/05/14 20:36
题意:
有两个黑社会帮派,有n个人,他们肯定属于两个帮派中的一个,然后有两种操作
1 D a b 给出a b 两个人不属于同一个帮派
2 A a b 问a b 两个人关系 输出 同一个帮派,不是同一个帮派,或者不确定
思路:
比较简单的带权并查集,容易想,方法固定,可以开距离根节点的距离这个权,或者是异或也行(应该是行,没试),如果是距离根节点的话 就是每次D a b 都把a b 看成是距离1,然后接在一起,A a b 时候看是不是同一个祖先,是的话看看距离权值是否奇偶性相同,如果不是同一个祖先就是不确定,还有连接之前记得看看是不是已经是一个祖先了,如果是就不要连接了,不然会把整体的权值弄乱,对于异或的话,直接在奇偶性那改成判断相等就行了。
#include<stdio.h>
#include<string.h>
#define N 100000 + 10
int mer[N];
int s_x[N];
int Finds(int x)
{
if(x == mer[x]) return x;
int t = mer[x];
mer[x] = Finds(mer[x]);
s_x[x] += s_x[t];
return mer[x];
}
int main ()
{
int t ,n ,m ,i ,a ,b;
char str[5];
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d" ,&n ,&m);
for(i = 1 ;i <= n ;i ++)
mer[i] = i ,s_x[i] = 0;
for(i = 1 ;i <= m ;i ++)
{
scanf("%s %d %d" ,str ,&a ,&b);
int x = Finds(a);
int y = Finds(b);
if(str[0] == 'D')
{
if(x == y) continue;
if(s_x[a] >= s_x[b])
{
mer[y] = x;
s_x[y] = s_x[a] - s_x[b] + 1;
}
else
{
mer[x] = y;
s_x[x] = s_x[b] - s_x[a] - 1;
}
}
else
{
if(n == 2 && a != b)
{
printf("In different gangs.");
}
else if(x == y)
{
if(s_x[a] % 2 == s_x[b] % 2)
printf("In the same gang.\n");
else printf("In different gangs.\n");
}
else
{
printf("Not sure yet.\n");
}
}
}
}
return 0;
}
有两个黑社会帮派,有n个人,他们肯定属于两个帮派中的一个,然后有两种操作
1 D a b 给出a b 两个人不属于同一个帮派
2 A a b 问a b 两个人关系 输出 同一个帮派,不是同一个帮派,或者不确定
思路:
比较简单的带权并查集,容易想,方法固定,可以开距离根节点的距离这个权,或者是异或也行(应该是行,没试),如果是距离根节点的话 就是每次D a b 都把a b 看成是距离1,然后接在一起,A a b 时候看是不是同一个祖先,是的话看看距离权值是否奇偶性相同,如果不是同一个祖先就是不确定,还有连接之前记得看看是不是已经是一个祖先了,如果是就不要连接了,不然会把整体的权值弄乱,对于异或的话,直接在奇偶性那改成判断相等就行了。
#include<stdio.h>
#include<string.h>
#define N 100000 + 10
int mer[N];
int s_x[N];
int Finds(int x)
{
if(x == mer[x]) return x;
int t = mer[x];
mer[x] = Finds(mer[x]);
s_x[x] += s_x[t];
return mer[x];
}
int main ()
{
int t ,n ,m ,i ,a ,b;
char str[5];
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d" ,&n ,&m);
for(i = 1 ;i <= n ;i ++)
mer[i] = i ,s_x[i] = 0;
for(i = 1 ;i <= m ;i ++)
{
scanf("%s %d %d" ,str ,&a ,&b);
int x = Finds(a);
int y = Finds(b);
if(str[0] == 'D')
{
if(x == y) continue;
if(s_x[a] >= s_x[b])
{
mer[y] = x;
s_x[y] = s_x[a] - s_x[b] + 1;
}
else
{
mer[x] = y;
s_x[x] = s_x[b] - s_x[a] - 1;
}
}
else
{
if(n == 2 && a != b)
{
printf("In different gangs.");
}
else if(x == y)
{
if(s_x[a] % 2 == s_x[b] % 2)
printf("In the same gang.\n");
else printf("In different gangs.\n");
}
else
{
printf("Not sure yet.\n");
}
}
}
}
return 0;
}
0 0
- POJ1703带权并查集(距离或者异或)
- poj1703(带权并查集)
- POJ1703带权并查集
- poj1703 Find them, Catch them(带权并查集)
- Poj1703并查集
- poj1703 并查集
- poj1703 并查集
- poj1703(并查集)
- poj1703并查集
- poj1703 并查集
- poj1703 并查集
- POJ1703 并查集
- POJ1703 并查集
- poj1703(种类并查集)
- 见微知著----POJ1703(并查集)
- POJ2492(A Bug's Life) && POJ1703(Find them, Catch them)带权(种类)并查集
- poj1703 Find them, Catch them——带权并查集
- poj1703 种类并查集
- elasticsearch FuzzyLikeThisQueryBuilder实例
- 机器学习技法-5-Kernel Logistic Regression
- 白话经典算法系列之五 归并排序的实现
- nf_conntrack: table full, dropping packet问题的解决思路
- android 开发必知的50个诀窍 1.
- POJ1703带权并查集(距离或者异或)
- java初探秘之判断输入的一串字符是否全为小写字母
- 不等宽子view自动换行的窗口(auto wrap viewgroup)
- Centos network check
- 在命令行下运行PHP CLI
- POJ1719行列匹配
- Swift from Scratch: Function Parameters, Types, and Nesting
- esp和ebp详解
- elasticsearch RangeFilter实例