题目链接:

https://vjudge.net/problem/POJ-1182

题目大意:

中文题,不多说。

思路:

给每个动物创建3个元素,i-A, i-B, i-C

i-x表示i属于种类x,并查集每个组表示组内元素同时发生或者同时不发生

举例说明,

对于x和y属于同一组,合并x和y,合并x+n和 y+n,合并x+2n和y+2n,这里需要判断x和y+n是否是同一组,x和y+2n是否是同一组,如果是的话那就表示出错。

对于x吃y,合并x和y+n,x+n和y+2n,x+2n和y。这里需要判断x和y,x和y+2n是否是同一类

并查集模板:

 //初始化n个元素
void init(int n)
{
for(int i = ; i < n; i++)
{
par[i] = i;
high[i] = ;
}
}
//查询树的根
int Find(int x)
{
return par[x] == x ? x : par[x] = Find(par[x]);//路径压缩
}
void unite(int x, int y)
{
x = Find(x);
y = Find(y);
if(x == y)return;
if(high[x] < high[y])par[x] = y;//y的高度高,将x的父节点设置成y
else
{
par[y] = x;
if(high[x] == high[y])high[x]++;
}
}
bool same(int x, int y)
{
return Find(x) == Find(y);
}

题解:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<sstream>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + ;
const int INF = << ;
int dir[][] = {,,,,-,,,-};
int T, n, m, x;
int high[maxn];//树的高度
int par[maxn];//父节点
//初始化n个元素
void init(int n)
{
for(int i = ; i < n; i++)
{
par[i] = i;
high[i] = ;
}
}
//查询树的根
int Find(int x)
{
return par[x] == x ? x : par[x] = Find(par[x]);//路径压缩
}
void unite(int x, int y)
{
x = Find(x);
y = Find(y);
if(x == y)return;
if(high[x] < high[y])par[x] = y;//y的高度高,将x的父节点设置成y
else
{
par[y] = x;
if(high[x] == high[y])high[x]++;
}
}
bool same(int x, int y)
{
return Find(x) == Find(y);
} int main()
{
//std::ios::sync_with_stdio(false);
cin >> n >> m;
init(n * );
//每个元素用x, x + n, x + 2 * n int c, x, y, ans = ;
while(m--)
{
scanf("%d%d%d", &c, &x, &y);
x--;//把输入变成0到n-1的下标
y--;
//不正确的编号
if(x < || x >= n || y < || y >= n)
{
ans++;
continue;
} if(c == )//属于同一类
{
if(same(x, y + n) || same(x, y + * n))ans++;
else
{
unite(x, y);
unite(x + n, y + n);
unite(x + * n, y + * n);
}
}
else//x吃y
{
if(same(x, y) || same(x, y + * n))ans++;
else
{
unite(x, y + n);
unite(x + n, y + * n);
unite(x + * n, y);
}
}
//cout<<ans<<endl;
}
cout<<ans<<endl;
return ;
}

最新文章

  1. C#版的mongodb最新的官方驱动2.4.0版本
  2. 状态机学习(二)解析INI文件
  3. Linux RPM 命令参数使用详解
  4. 荒木毬菜 小情歌日文版 - 独身OL之歌
  5. [改善Java代码]覆写变长方法也循规蹈矩
  6. 常用SNS开源系统比较
  7. 使用过渡场景在多个场景的切换COCOS2D(4)
  8. 远程访问mysql(转)
  9. js获取tr,td内容并排序
  10. struts2捕获action类异常
  11. C语言学习之assert
  12. MySQL数据类型--与MySQL零距离接触2-6数据表
  13. Oracle总结之plsql编程(基础九)
  14. Qt之QLocalSocket
  15. 北京Uber优步司机奖励政策(4月14日)
  16. Hive QL——深入浅出学Hive
  17. 【递推】【DFS】【枚举】Gym - 101246C - Explode &#39;Em All
  18. 移动测试之appium+python 导出报告(六)
  19. 转:WebRTC技术及应用2 – NAT穿越技术的使用
  20. [luoguP2606] [ZJOI2010]排列计数(DP)

热门文章

  1. TCP和UDP协议的区别
  2. 多进程浏览器、多线程页面渲染与js的单线程
  3. linux系统命令学习-用户管理
  4. 关于ORM,以及Python中SQLAlchemy的scoped_session
  5. Docker深入浅出系列教程——Docker初体验
  6. 【R语言系列】read.table报错incomplete final line found by readTableHeader
  7. C语言第二次博客作业—分支结构
  8. 算法第四版学习笔记之优先队列--Priority Queues
  9. itchat 微信的使用
  10. 配置SpringAop时需要用到的AspectJ表达式