poj 1182 食物链 并查集的又一个用法
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 41584 | Accepted: 12090 |
Description
现有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
以下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 食物链 并查集的又一个用法的更多相关文章
- POJ 1182 食物链 [并查集 带权并查集 开拓思路]
传送门 P - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit ...
- poj 1182 食物链 并查集 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=1182 题解 可以考虑使用并查集解决 但是并不是简单的记录是否同一组的这般使用 每个动物都有三个并查集 自己 天敌 捕食 并查集 那么在获得 ...
- POJ 1182 食物链(并查集的使用)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 81915 Accepted: 24462 Description ...
- POJ 1182食物链(并查集)
食物链Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 85474 Accepted: 25549Description动物王国中有三 ...
- POJ - 1182 食物链 并查集经典
思路:设r(x)表示节点x与根结点的关系,px表示x的根结点.记录每个节点与其父节点的关系,就能很方便知道每个节点以及和它的父节点的关系. struct node{ int par; //父亲节点 i ...
- poj——1182食物链 并查集(提升版)
因为是中文题,题意就不说了,直接说思路: 我们不知道给的说法中的动物属于A B C哪一类,所以我们可以用不同区间的数字表示这几类动物,这并不影响结果,我们可以用并查集把属于一类的动物放在一块,举个例子 ...
- POJ 1182 食物链 (并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 50601 Accepted: 14786 Description ...
- POJ 1182 食物链(并查集)
题目链接 经过宝哥的讲解,终于对这种问题有了进一步的理解.根据flag[x]和flag[y]求flag[tx]是最关键的了. 0吃1,1吃2,2吃0. 假设flag[tx] = X; 那么X + fl ...
- poj 1182 (关系并查集) 食物链
题目传送门:http://poj.org/problem?id=1182 这是一道关系型并查集的题,对于每个动物来说,只有三种情况:同类,吃与被吃: 所以可以用0,1,2三个数字代表三种情况,在使用并 ...
随机推荐
- Ping Pod不通问题定位及Ingress验证
Ping Pod网络问题不通定位记录 1.验证墙是否通 flannel默认使用8285端口作为UDP封装报文的端口,VxLan使用8472端口,下面命令验证一下确定其在8472端口 ip -d lin ...
- [转]使用VS2010的Database 项目模板统一管理数据库对象
本文转自:http://www.cnblogs.com/shanyou/archive/2010/05/08/1730810.html Visual Studio 2010 有一个数据库项目模板:Vi ...
- [Python爬虫] 之二十九:Selenium +phantomjs 利用 pyquery抓取节目信息信息
一.介绍 本例子用Selenium +phantomjs爬取节目(http://tv.cctv.com/epg/index.shtml?date=2018-03-25)的信息 二.网站信息 三.数据抓 ...
- [ES6] 10. Array Comprehensions
ES6 decided that Array Comprehensions will not included in this version, ES7 will include this. Ther ...
- automake连载---关于两个文件configure.in和Makefile.am的编写
http://blog.csdn.net/shanzhizi/article/details/30251763 automake主要通过编辑Makefile.am来控制它的行为,下面就常用的三个Mak ...
- 安装程序集'' policy.8.0.microsoft.vc80.atl,type=''win32-
ThinkPad Bluetooth with Enhanced Data Rate II 软件 在Windows 7 64-bit 下无法安装完成,弹出窗口提示 :安装程序集''policy.8.0 ...
- 解决Eclipse下不自动拷贝apk到模拟器问题( The connection to adb is down, and a severe error has occured)
如题 解决方案如下: 1.先把eclipse关闭.2.在管理器转到你的android SDK 的platform-tools下3.键入adb kill-server ,如果adb关闭了会提示 serv ...
- 算法笔记_077:蓝桥杯练习 K好数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4, ...
- HKC显示器开机亮一下就不显示了
一台HKC显示器开机显一下就黑了 最近加了一个显示器做扩展屏幕,可以不亮有问题啊 芯片坏了引起的~ 不是自己的,不能拆机啊啊 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论 ...
- 【DB2】If 'db2' is not a typo you can run the following command to lookup the package that contains the binary: command-not-found db2 bash: db2: command not found
数据库安装以后,db2报错如下: If 'db2' is not a typo you can run the following command to lookup the package that ...