POJ NO.1182 食物链(并查集,带权并查集最优解,没有之一)
来源:互联网 发布:淘宝虚拟物品货源 编辑:程序博客网 时间:2024/06/15 10:41
问题描述:
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。
现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。
有人用两种说法对这N个动物所构成的食物链关系进行描述:
第一种说法是"1 X Y",表示X和Y是同类。
第二种说法是"2 X Y",表示X吃Y。
此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
1) 当前的话与前面的某些真的话冲突,就是假话;
2) 当前的话中X或Y比N大,就是假话;
3) 当前的话表示X吃X,就是假话。
你的任务是根据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。
题目链接:POJ NO.1182
思路:
我们用x\y, x\y + N, x\y + 2 * N 分别表示A、B、C三类。
这样只需判断x...,y...是否在一个组里即可根据类型信息判断是否是实话。
代码:
#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cmath>#include<queue>#include<stack>#include<cstring>#include<string>#include<vector>#include<set>using namespace std;#define X first#define Y second#define PI 3.1415926const int MAX_N = 5e4 + 100;const int MAX_K = 1e5 + 100;const int INF = 0x3f3f3f3f;int N, K;int par[3*MAX_N];int T[MAX_K], X[MAX_K], Y[MAX_K];void init(int n){ for(int i = 0; i < n; i++){ par[i] = i; }}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 ; }else par[x] = y;}bool same(int x, int y){ return find(x) == find(y);}int main(){ scanf("%d%d", &N, &K); init(3 * N); for(int i = 0; i < K; i++){ scanf("%d%d%d", &T[i], &X[i], &Y[i]); } int ans = 0; for(int i = 0; i < K; 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){ /* same(x, y + N)已经囊括了 unite(x, y + N); unite(x + N, y + 2 * N); unite(x + 2 * N, y); 这三种,他们是分不开的。 下面的same(x, y),也是同样的道理。 same(x, y + 2 * N)(A,C)则表示相隔两类。 这样四种情况“压缩成了两种” 下面是同样的道理 */ if(same(x, y + N) || same(x, y + 2 * N)){ ans++; } else{ unite(x, y); unite(x + N, y + N); unite(x + 2 * N, y + 2 * N); } } 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
- POJ NO.1182 食物链(并查集,带权并查集最优解,没有之一)
- 食物链(poj-1182)(带权并查集)
- POJ 1182 食物链(带权并查集)
- POJ-1182 食物链 (带权并查集)
- poj 1182 食物链(带权并查集)
- POJ 1182 食物链(带权并查集)
- poj 1182食物链(带权并查集)
- POJ 1182 食物链(带权并查集)
- POJ 1182 食物链 (经典带权并查集)
- POJ 1182 食物链(带权并查集)
- POJ 1182 食物链(带权并查集)
- POJ 1182 食物链(带权并查集)
- POJ 1182 食物链(并查集 带权路径)
- POJ 1182 食物链 (带权并查集)
- kuangbin专题五 并查集 POJ 1182食物链(带权并查集)重要
- poj 1182 食物链(带权并查集)
- poj 1182 食物链(带权并查集)
- POJ 1182 食物链(带权并查集)
- 基础网络学习记录
- 调试CC2540遇到的小问题
- C++ 拷贝构造函数 赋值构造函数
- windows下MemCached的安装
- template关键字
- POJ NO.1182 食物链(并查集,带权并查集最优解,没有之一)
- YTU 2432: C++习题 对象数组输入与输出
- POJ 3565 Ants(二分图最小权完备匹配)
- poj 1324(BFS+状态压缩)
- Android Studio如何删除module
- 【LeetCode OJ 14】Longest Common Prefix
- 枚举类型模拟
- 学习redis基础命令网站
- Swift中定义protocol,定义optional方法