NOI2001|POJ1182食物链[种类并查集 向量]
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 65430 | Accepted: 19283 |
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
多了一种关系的种类并查集
v[i] 0和根同类 1吃根 2被根吃
可以发现1->0->2->1.....
可以从向量的角度思考,比如x->y +3%3是1的话说明x吃y
v[x]就是x->fa[x]这个向量的值
发现D-1正好描述了X->Y这个向量的关系
路径压缩和合并的时候都画图用向量推一下就可以了
还有一种做法,是对每个动物x建立3个集合:x表示与x同类的动物,x+n表示要x吃的动物,x+2*n表示吃x的动物。
一些理解
并查集就是维护了一些关系
种类并查集是把知道关系的东西合并,通过分配一个值来处理
另一种做法是把同一类合并
//
// main.cpp
// poj1182
//
// Created by Candy on 31/10/2016.
// Copyright ? 2016 Candy. All rights reserved.
// #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=5e4+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,c,x,y,ans=;
int fa[N],v[N];
inline int find(int x){
if(x==fa[x]) return x;
int root=find(fa[x]);
v[x]=(v[x]+v[fa[x]])%;//x->fa[x] + fa[x]->root
return fa[x]=root;
}
inline int unn(int x,int y,int op){
int f1=find(x),f2=find(y);
if(f1==f2){
if((-v[y]+v[x]+)%!=op) return ;
}else{
fa[f1]=f2;
v[f1]=(op+v[y]-v[x]+)%;
}
return ;
}
int main(int argc, const char * argv[]) {
n=read();m=read();
for(int i=;i<=n;i++) fa[i]=i,v[i]=;
for(int i=;i<=m;i++){
c=read();x=read();y=read();
if(x>n||y>n||(c==&&x==y)){ans++;continue;}
ans+=unn(x,y,c-);
}
printf("%d",ans);
return ;
}
来自luogu题解,另一种做法
这题显然要用并查集。因为只有3种动物,我的方法是对每个动物x建立3个集合:x表示与x同类的动物,x+n表示要x吃的动物,x+*n表示吃x的动物。 对于每个读入的描述D X Y,做以下处理: 如果X或Y不再区间[,n]中,这句是假话。 D为1
如果x+n或x+*n与y在同一个集合中说明已知x和y不是同一种动物,这句是假话; 否则,分别将x与y,x+n与y+n,x+*n与y+*n合并。 D为2
如果x与y在同一个集合中,说明已知x和y是同一种动物,这句是假话; 如果x+*n与y在同一个集合中,说明已知y吃x,这句是假话; 否则,分别将x与y+*n,x+n与y,x+*n与y+n合并。 <hr> 说起来很复杂,实现起来其实很简单,代码见下: #include<iostream>
#include<algorithm>
using namespace std;
int p[];
int Find(int x) { return x == p[x] ? x : p[x] = Find(p[x]); }
void Init(int n) { for (int i = ; i <= * n; i++) p[i] = i; }
void Union(int x, int y)
{
int xx = Find(x), yy = Find(y);
if (xx != yy) p[xx] = yy;
}
int main()
{
int n, k, ans = ;
cin >> n >> k;
Init(n);
for (int i = ; i <= k; i++)
{
int a, x, y;
cin >> a >> x >> y;
if (x > n || y > n || x < || y < ) { ans++; continue; }
if (a == )
{
if (Find(x + n) == Find(y) || Find(x + * n) == Find(y)) { ans++; continue; }
Union(x, y);
Union(x + n, y + n);
Union(x + * n, y + * n);
}
else
{
if (Find(x) == Find(y) || Find(x + * n) == Find(y)) { ans++; continue; }
Union(x, y + * n);
Union(x + n, y);
Union(x + * n, y + n);
}
}
cout << ans;
}
NOI2001|POJ1182食物链[种类并查集 向量]的更多相关文章
- POJ1182 食物链 —— 种类并查集
题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- poj1182(种类并查集好题)
不得不说,我得感谢@驱动幽灵百鬼夜行小肆,正是因为看明白了他给出的解析,我才完全弄懂种类并查集的,这里,我也不想去改其他的,就直接引用他的解题报告吧 转载:http://blog.csdn.net/c ...
- P2024 [NOI2001]食物链(种类并查集)
题目链接: https://www.luogu.org/problemnew/show/P2024 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 ...
- POJ1182 食物链(并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 55260 Accepted: 16210 Description ...
- POJ1182食物链(并查集)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- POJ-1182 食物链(并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 75814 Accepted: 22528 Description ...
- poj1182 食物链【并查集-好题!】
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两 ...
- POJ1182食物链 (并查集)
第一反应就是和那个搞基的虫子的题很像(poj2492 http://www.cnblogs.com/wenruo/p/4658874.html),不过是把种类从2变成了3. 错在很白痴的地方,卡了好久 ...
- poj1182 食物链(并查集 好题)
https://vjudge.net/problem/POJ-1182 并查集经典题 对于每只动物创建3个元素,x, x+N, x+2*N(分别表示x属于A类,B类和C类). 把两个元素放在一个组代表 ...
随机推荐
- Mybatis框架中实现双向一对多关系映射
学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...
- C#写爬虫,版本V2.1
这次是对2.0的小修补,2.0交互几乎没有,这次添加了进度条,和文本框,同时由于取得的链接主要会出现错误是:webResponse错误. 针对这种情况,设置了 try { webResponse = ...
- 采花 bzoj 2743
采花(1s 128MB)flower [题目描述] 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整 ...
- Linux中shell脚本自动输入密码
最近遇到蛋疼的事,就是在shell脚本中需要获取root权限,因此在shell脚本运行过程中需要输入密码. 懒惰的我当然想让shell在执行过程中就可以自动输入密码,这样就可以抽空看看妹子图.. 我通 ...
- 【转】Windows 窗口层次关系
原文链接:undefined! 相信在Windows 下面编程的很多兄弟们都不是很清楚Windows 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所 ...
- 【读书笔记】2016.11.19 北航 《GDG 谷歌开发者大会》整理
2016.11.19 周六,我们在 北航参加了<GDG 谷歌开发者大会>,在web专场,聆听了谷歌公司的与会专家的技术分享. 中午免费的午餐,下午精美的下午茶,还有精湛的技术,都是我们队谷 ...
- Java开发web的几种开发模式
Java Web开发方案有多种可供选择,这里列举一些经典的开发模式进行横向比较,为Java Web的开发模式选择提供参考.除此之外还有好多方案(如Tapestry和Wicket等等)并不了解,这里就不 ...
- 取消IE提示下载安全提问
需求:在企业访问内部WEB系统下载文件时,IE总会弹出安全提问,征得用户同意后弹出下载保存框.现用户需要点击下载后,直接弹出下载保存框. 方案:这涉及IE安全定义问题,进行相关设置即可.方法如下:
- linux文件目录详解
文件系统的是用来组织和排列文件存取的,所以她是可见的,在Linux中,我们可以通过ls等工具来查看其结构,在Linux系统中,我们见到 的都是树形结构:比如操作系统安装在一个文件系统中,他表现为由/起 ...
- 适配ios10(iTunes找不到构建版本)
前两天上架App遇到一个比较神奇的问题,打包好的项目使用Application Loader上传成功,但是在iTunes里面却找不到构建版本,App的活动页面也没有相应的版本. 之前了解IOS10对用 ...