食物链
 
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 41584   Accepted: 12090

Description

动物王国中有三类动物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),输出假话的总数。

Input

第一行是两个整数N和K,以一个空格分隔。

以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。

若D=1,则表示X和Y是同类。

若D=2,则表示X吃Y。

Output

只有一个整数,表示假话的数目。

Sample Input

100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5

Sample Output

3
注意:此题只有一组输入数据就行了,多组的话,就出错了;
 /*
讲解:这道题也是并查集的应用,相比其他的来说,增加了两者之间的关系,而不是直接统计合并两个数组;
0 代表两者是同类;
1 代表被父亲吃;
2 代表吃掉父亲;
基本上这一类的题目都是用的这一种方法,理解之后就能套用了;
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<queue>
using namespace std;
int n,k;
struct T
{
int parent,relation;
}tree[];
void begin() // 初始化时,自己的父亲是自己
{ // 关系全部初始化为0
for(int i=; i<=n; i++)
{
tree[i].parent=i;
tree[i].relation=;
}
}
int find(int x) //查找父亲并更新自己与父亲节点的关系
{
int temp;
if(tree[x].parent!=x)
{
temp=tree[x].parent;
tree[x].parent=find(tree[x].parent);
tree[x].relation=(tree[x].relation+tree[temp].relation)%;
}
return tree[x].parent;
}
void Merge(int x,int y,int px,int py,int d) //父亲不同的时候,把后一个当成自己的父亲并更新关系;
{
tree[py].parent=px;
tree[py].relation=((-tree[y].relation)+(d-)+tree[x].relation)%; //理解不了,就先记清;
}
int main()
{
int i,j;
int px,x,y,py,d,ans;
scanf("%d %d",&n,&k);
begin();
ans=;
for(i=; i<=k; i++)
{
scanf("%d %d %d",&d,&x,&y);
if(x>n || y>n || (d== && x==y) ) //如果超过了范围,或者自己把自己给吃了;
ans++;
else
{
px=find(x);py=find(y);
if ( px != py ) //父亲不同的时候,把后一个当成自己的父亲并更新关系;
Merge(x,y,px,py,d);
else
{ // 父亲相同,两个人的关系不同,ans++;
if(d== && tree[x].relation != tree[y].relation)
ans++;
if (d== && (tree[y].relation + -tree[x].relation)% != ) //算法公式,要弄明白,不明白的话,先记着;
ans++;
}
} } cout<<ans<<endl;
return ;
}

poj 1182 食物链 并查集的又一个用法的更多相关文章

  1. POJ 1182 食物链 [并查集 带权并查集 开拓思路]

    传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit  ...

  2. poj 1182 食物链 并查集 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=1182 题解 可以考虑使用并查集解决 但是并不是简单的记录是否同一组的这般使用 每个动物都有三个并查集 自己 天敌 捕食 并查集 那么在获得 ...

  3. POJ 1182 食物链(并查集的使用)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 81915   Accepted: 24462 Description ...

  4. POJ 1182食物链(并查集)

    食物链Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 85474 Accepted: 25549Description动物王国中有三 ...

  5. POJ - 1182 食物链 并查集经典

    思路:设r(x)表示节点x与根结点的关系,px表示x的根结点.记录每个节点与其父节点的关系,就能很方便知道每个节点以及和它的父节点的关系. struct node{ int par; //父亲节点 i ...

  6. poj——1182食物链 并查集(提升版)

    因为是中文题,题意就不说了,直接说思路: 我们不知道给的说法中的动物属于A B C哪一类,所以我们可以用不同区间的数字表示这几类动物,这并不影响结果,我们可以用并查集把属于一类的动物放在一块,举个例子 ...

  7. POJ 1182 食物链 (并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 50601   Accepted: 14786 Description ...

  8. POJ 1182 食物链(并查集)

    题目链接 经过宝哥的讲解,终于对这种问题有了进一步的理解.根据flag[x]和flag[y]求flag[tx]是最关键的了. 0吃1,1吃2,2吃0. 假设flag[tx] = X; 那么X + fl ...

  9. poj 1182 (关系并查集) 食物链

    题目传送门:http://poj.org/problem?id=1182 这是一道关系型并查集的题,对于每个动物来说,只有三种情况:同类,吃与被吃: 所以可以用0,1,2三个数字代表三种情况,在使用并 ...

随机推荐

  1. boost.asio包装类st_asio_wrapper开发教程(转)

    一:什么是st_asio_wrapper它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_w ...

  2. UITabBarController 和 UINavigationController 的详解

    首先得搞清这两个控制器之间的层级关系,我们直接看官网给的图,如下所示: 从这张图可以看到:最右边的Assembled views是呈现给用户的界面,它左边的Window是最底层的窗口,重点来了,再往左 ...

  3. Android内存优化13 内存泄漏常见情况4 资源泄漏

    资源未关闭或释放导致内存泄露 在使用IO.File流或者Sqlite.Cursor等资源时要及时关闭.这些资源在进行读写操作时通常都使用了缓冲,如果及时不关闭,这些缓冲对象就会一直被占用而得不到释放, ...

  4. JS中for和forEach的区别

    https://thejsguy.com/2016/07/30/javascript-for-loop-vs-array-foreach.html

  5. 兄弟连新版Linux视频教程

    兄弟连新版Linux视频教程目录:F:\linux\兄弟连新版Linux视频教程├(1)云计算是什么东西集群又是嘛玩意?.mp4├(2)兄弟连新版Linux教程 1.1.1 Linux系统简介-UNI ...

  6. 配置Eclipse自动编译NDK/JNI

    Eclipse关联ndk-build(自建Builder方法)  1. Project->Properties->Builders->New,新建一个Builder 2. 参数配置 ...

  7. 《深入理解Java虚拟机》笔记7

    组内有人问我,她写的程序总是在短时间内就jvm异常. 另外,debug时候又可以正常通过,写的逻辑并不复杂, 只是用poi检索Excel.第一反应还是程序可能写的有问题, 也许写了一个jvm未预测的错 ...

  8. android开发笔记之Volley (1)

    1. volley的简介 Volley is an HTTP library that makes networking for Android apps easier and most import ...

  9. Kolla 4.0.0环境下VIP无法迁移问题排查

    VRRP无法切换VIP的问题分析: Keepalived的配置文件:/etc/kolla/keepalived/keepalived.conf当中,nopreempt选项是影响切换的因素之一,另一个因 ...

  10. 【转】C语言中结构体的位域(bit-fields)

    有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构 ...