并查集
来源:互联网 发布:js中如何给文本框赋值 编辑:程序博客网 时间:2024/06/06 06:38
题目:http://poj.org/problem?id=1182
为每个动物创建三个元素i-A,i-B,i-C,并利用这3*N个元素建立并查集。
参考挑战程序设计书
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;#define maxn 100009int N, K;int par[maxn*3], rankx[maxn*3];int T[maxn], X[maxn], Y[maxn];void init(int n){ for(int i=0;i<n;i++) { par[i]=i; rankx[i]=0; }}int find(int x){ if(par[x]==x) return x; else{ return par[x] = find(par[x]); }}void unite(int x, int y){ x = find(x); y = find(y); if(x == y) return ; if(rankx[x] < rankx[y]) { par[x]=y; }else{ par[y]=x; if(rankx[x]==rankx[y]) rankx[x]++; }}bool same(int x, int y){ return find(x)==find(y);}int main(){ scanf("%d%d", &N,&K); init(N*3); int ans=0, x, y, t; for(int i=0;i<K;i++) { scanf("%d %d %d", &T[i],&X[i], &Y[i]); int t = T[i]; int x = X[i] - 1, y = Y[i] - 1; if(x <0 ||N <= x || y <0||N<=y){ ans++; continue; } if(t==1) { if(same(x, y + N)||same(x, y+2*N)){ ans++; } else { unite(x, y); unite(x+N, y+N); unite(x+N*2, y+N*2); } } else { if(same(x, y) || same(x, y + 2 *N)){ ans++; } else { unite(x, y+N); unite(x+N, y+2*N); unite(x+2*N, y); } } } printf("%d\n", ans); return 0;}
阅读全文
1 0
- HDU3938 并查集 并查集
- 并查集(集并查)
- HDU1232 并查集<并>
- 并查集
- 数据结构-并查集
- 并查集
- 并查集!
- 并查集
- 并查集
- 并查集
- 并查集
- 并查集总结
- 并查集学习
- 并查集
- 并查集
- 并查集
- 所谓并查集
- 并查集
- Bombing(map+multset)
- nginx配置详解--动静分离
- 日常学习2017.08.05
- UDP客户端
- CodeVS 2370 LCA 解题报告
- 并查集
- C语言常见错误
- Android----动画
- java学习20天总结7-31到8-4
- 欢迎使用CSDN-markdown编辑器
- 阿里云服务器中CentOs6.8安装mysql数据库
- nginx日志生成
- JVM垃圾回收算法与参数配置
- 两个有序链表2