poj 1182 1988 并查集
2011-05-02 09:33
239 查看
这两个题目都要设一个数组表示当前元素和根结点的关系,当合并和查找时,由于根结点改变,所以当前元素和根结点的关系也要改变
poj 1182
题目大意:三种动物A,B,C,关系是A吃B,B吃C,C吃A ,给出一些判断,根据题意找出假话的总数
代码:
#include<iostream>
using namespace std;
int r[50010],parent[50010]; //r[]表示当前元素和根节点的关系,在这个题目里是吃与被吃的关系
void makeSet(int n){
int i;
for(i = 1;i <= n;i++){
parent[i] = i;
r[i] = 0;
}
}
int findSet(int x){
if(x != parent[x]){
int temp = parent[x];
parent[x] = findSet(parent[x]);
r[x] = (r[x]+r[temp])%3; //列举数据 推导公式
}
return parent[x];
}
void Union(int ra,int rb,int a,int b,int d){
parent[rb] = ra;
r[rb] = (r[a]-r[b]+2+d)%3;//同上
}
int main(){
int n,k,count = 0;
scanf("%d%d",&n,&k);
makeSet(n);
while(k--){
int a,b,d;
scanf("%d%d%d",&d,&a,&b);
if(a > n||b > n||(d == 2&&a == b)){
count++;
continue;
}
int ra = findSet(a);
int rb = findSet(b);
if(ra == rb){ //在一个集合中说明关系能判断
if(d == 1&&r[a] != r[b])
count++;
else if(d == 2&&r[a] != (r[b]+2)%3)
count++;
}
else
Union(ra,rb,a,b,d); //如果关系能判断 就放入集合中
}
printf("%d/n",count);
return 0;
}
poj 1988
题目大意:一些积木,标号为1到N,M a b 表示把a所在的那一列整体移动到b的上面,C a 则输出a的下面有多少积木
代码:
#include<iostream>
using namespace std;
#define N 30010
int parent
,num
,r
;//r[]表示当前元素和根节点的关系 在这个题目里是深度
void makeSet(int n){
int i;
for(i = 1;i <= n;i++){
parent[i] = i;
num[i] = 1;
r[i] = 0;
}
}
int findSet(int x){
if(x != parent[x]){
int temp = parent[x];
parent[x] = findSet(parent[x]);
r[x] += r[temp];
}
return parent[x];
}
void Union(int a,int b){
int ra = findSet(a);
int rb = findSet(b);
parent[rb] = ra;
r[rb] = num[ra];
num[ra] += num[rb];
}
int main(){
int n;
char ch;
int a,b;
int ra,rb;
while(scanf("%d",&n) != EOF){
makeSet(N);
while(n--){
getchar();
scanf("%c",&ch);
if(ch == 'M'){
scanf("%d%d",&a,&b);
ra = findSet(a);
rb = findSet(b);
if(ra != rb)
Union(a,b);
}
else if(ch == 'C'){
scanf("%d",&a);
ra = findSet(a);
printf("%d/n",num[ra]-r[a]-1);
}
}
}
return 0;
}
类似的并查集基础题还有 poj 1703 2492 2236 1308
poj 1182
题目大意:三种动物A,B,C,关系是A吃B,B吃C,C吃A ,给出一些判断,根据题意找出假话的总数
代码:
#include<iostream>
using namespace std;
int r[50010],parent[50010]; //r[]表示当前元素和根节点的关系,在这个题目里是吃与被吃的关系
void makeSet(int n){
int i;
for(i = 1;i <= n;i++){
parent[i] = i;
r[i] = 0;
}
}
int findSet(int x){
if(x != parent[x]){
int temp = parent[x];
parent[x] = findSet(parent[x]);
r[x] = (r[x]+r[temp])%3; //列举数据 推导公式
}
return parent[x];
}
void Union(int ra,int rb,int a,int b,int d){
parent[rb] = ra;
r[rb] = (r[a]-r[b]+2+d)%3;//同上
}
int main(){
int n,k,count = 0;
scanf("%d%d",&n,&k);
makeSet(n);
while(k--){
int a,b,d;
scanf("%d%d%d",&d,&a,&b);
if(a > n||b > n||(d == 2&&a == b)){
count++;
continue;
}
int ra = findSet(a);
int rb = findSet(b);
if(ra == rb){ //在一个集合中说明关系能判断
if(d == 1&&r[a] != r[b])
count++;
else if(d == 2&&r[a] != (r[b]+2)%3)
count++;
}
else
Union(ra,rb,a,b,d); //如果关系能判断 就放入集合中
}
printf("%d/n",count);
return 0;
}
poj 1988
题目大意:一些积木,标号为1到N,M a b 表示把a所在的那一列整体移动到b的上面,C a 则输出a的下面有多少积木
代码:
#include<iostream>
using namespace std;
#define N 30010
int parent
,num
,r
;//r[]表示当前元素和根节点的关系 在这个题目里是深度
void makeSet(int n){
int i;
for(i = 1;i <= n;i++){
parent[i] = i;
num[i] = 1;
r[i] = 0;
}
}
int findSet(int x){
if(x != parent[x]){
int temp = parent[x];
parent[x] = findSet(parent[x]);
r[x] += r[temp];
}
return parent[x];
}
void Union(int a,int b){
int ra = findSet(a);
int rb = findSet(b);
parent[rb] = ra;
r[rb] = num[ra];
num[ra] += num[rb];
}
int main(){
int n;
char ch;
int a,b;
int ra,rb;
while(scanf("%d",&n) != EOF){
makeSet(N);
while(n--){
getchar();
scanf("%c",&ch);
if(ch == 'M'){
scanf("%d%d",&a,&b);
ra = findSet(a);
rb = findSet(b);
if(ra != rb)
Union(a,b);
}
else if(ch == 'C'){
scanf("%d",&a);
ra = findSet(a);
printf("%d/n",num[ra]-r[a]-1);
}
}
}
return 0;
}
类似的并查集基础题还有 poj 1703 2492 2236 1308
相关文章推荐
- CSU-ACM2017暑期训练10-并查集&&HASH C - 食物链 POJ - 1182 (并查集好题)
- POJ - 1182 食物链(并查集)
- poj 1988(并查集_点到跟的距离)
- poj 1988 并查集(终于看懂一个了/(ㄒoㄒ)/~~)
- POJ 1182(并查集)
- poj1182 并查集
- 【POJ 1182 食物链】+ 并查集
- poj 1988(并查集)Cube Stacking
- POJ 1182 食物链 带权并查集
- poj 1182 食物链(关系并查集)
- poj1182~食物链~种类并查集
- 并查集练习---poj 1182 食物链
- POJ 1182 食物链 并查集
- 带权并查集 POJ1988 POJ2492
- POJ 1182 食物链(分层并查集)
- POJ 1182 食物链 (并查集)
- 《挑战程序设计竞赛》2.4 数据结构-并查集 POJ1182 2236 1703 AOJ2170
- POJ 1182 食物链 带权并查集
- POJ 1988 Cube Stacking || HDU 2818 Building Block 带权并查集
- [poj 1182]食物链[并查集][图解+注释]