并查集:POJ 1182 食物链 复习
2024-10-05 03:12:07
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std; const int maxn = * + ;
int par[maxn];
int Rank[maxn];
int N, K;
int T[maxn], X[maxn], Y[maxn]; //初始化n个元素
void init(int n)
{
for (int i = ; i < n; i++)
{
par[i] = i;
Rank[i] = ;
}
} //查询树的根
int Find(int x)
{
if (par[x] == x)
{
return x;
}
else
{
return par[x] = Find(par[x]);
}
} //合并x和y所述的集合
void unite(int x, int y)
{
x = Find(x);
y = Find(y);
if (x == y) return; if (Rank[x] < Rank[y]) {
par[x] = y;
}
else {
par[y] = x;
if (Rank[x] == Rank[y]) Rank[x]++;
}
} bool same(int x, int y)
{
return Find(x) == Find(y);
} void input()
{
scanf("%d%d", &N, &K);
for (int i = ; i < K; i++)
{
scanf("%d%d%d", &T[i], &X[i], &Y[i]);
}
} void solve()
{
input();
//初始化并查集
//元素x, x + N, x + 2*N 分别代表 x-A, y-B, x-C
init(N * ); int ans = ;
for (int i = ; i < K; i++)
{
int t = T[i];
int x = X[i] - , y = Y[i] - ; //把输入变成 0, ... , N-1 范围 //不正确的编号
if (x < || x >= N || y < || y >= N)
{
ans++;
continue;
} if (t == )
{
//"x和y属于同一类"的信息
if (same(x, y + N) || same(x, y + *N))
{
ans++;
}
else
{
//同属A,或B,或C类
unite(x, y);
unite(x + N, y + N);
unite(x + *N, y + *N);
}
}
else {
//"x吃y"的信息错,同为一类,或者隔了1类
if (same(x, y) || same(x, y + *N)) {
ans++;
}
else {
unite(x, y + N); // A -> B
unite(x + N, y + * N); // B -> C
unite(x + * N, y); // C -> A
}
}
}
printf("%d\n", ans);
} int main()
{
solve(); return ;
}
最新文章
- H5 Notes:PostMessage Cross-Origin Communication
- 搭建Android底层开发环境
- Oracle 11.2.0.1的一个Bug,客户端报ORA-03113: 通信通道的文件结尾
- linux 命令总结
- javascript学习-原生javascript的小特效(简单的运动效果)
- java,UDP协议简单实现
- ARM architectures
- hdu 4670 树的点分治
- javascript 一串DIV跟随鼠标移动
- Inside Qt Series (全集)
- cocos2d-x: 33种切换场景
- 苹果(APPLE)开发人员账号说明及注冊流程(99美元公司版/个人版及299美元企业版)
- HTML ——Flex弹性布局
- Maven学习-Profile详解
- GHO2VMDK转换工具分享含VS2010源码
- ubuntu小技巧(不定期更新)
- 43.Linux调试测试输入思路
- [BZOJ2761] [JLOI2011] 不重复数字 (set)
- Chrome 控制台报错Unchecked runtime.lastError: The message port closed before a response was received
- jeesite 下载ckfinder上传的文件