POJ 1182 (经典食物链 /并查集扩展)
向量偏移——由“食物链”引发的总结
http://poj.org/problem?id=1182这道食物链题目是并查集的变型。非常久曾经做的一次是水过的,这次细致地研究了这“食物链”,无非就是运用向量偏移。从曾经节点与节点转化成向量与向量的关系。我们能够把矛盾的产生得益于向量偏移时的结果。
直接引出向量偏移的运用。
以下是POJ一位大牛这样理解的,本人稍有改动。
对于集合里的随意两个元素a,b而言,它们之间必然存在着某种联系,由于并查集中的元素均是有联系的。否则也不会被合并到当前集合中。
那么我们就把这2个元素之间的关系量转化为一个偏移量。以食物链的关系而言。最好还是如果
a->b 偏移量0时 a和b同类
a->b 偏移量1时 a吃b
a->b 偏移量2时 a被b吃,也就是b吃a
有了这些基础,我们就能够在并查集中完毕随意两个元素之间的关系转换了。最好还是继续如果,a的当前集合根节点aa。b的当前集合根节点bb,a->b的偏移值为d-1(题中给出的询问已知条件)
(1)假设aa和bb不同样,那么我们把bb合并到aa上,而且更新delta[bb]值(delta[i]表示i的当前集合根节点到i的偏移量)
此时 aa->bb = aa->a + a->b + b->bb,可能这一步就是所谓向量思维模式吧
上式进一步转化为:aa->bb = (3-delta[a]+d-1+delta[b])%3 = delta[bb]。(模3是保证偏移量取值始终在[0,2]间)
以图示表示为:
(2)假设aa和bb同样,那么我们就验证a->b之间的偏移量是否与题中给出的d-1一致
此时 a->b = a->aa + aa->b = a->aa + bb->b,
上式进一步转化为:a->b = (3+delta[a]-delta[b])%3,若一致则为真。否则为假。
以图示表示为:
一般化总结:
并查集的偏移向量属于并查集的变形,仅仅要适用于集合数目较少,或是固定的并查集类型。
#include<iostream>
#include<cstdio>
#define maxn 50001
using namespace std; int uset[maxn],rel[maxn]; int find_uset(int x)
{
if(uset[x]!=x)
{
int k=uset[x]; //先写
uset[x]=find_uset(uset[x]); //注意上下两处。由于递归调用循序的原因。 rel[x]=(rel[k]+rel[x])%3; //后写。
}
return uset[x];
} int make_uset(int x,int y,int d)
{
int ux,uy;
if((ux=find_uset(x))==(uy=find_uset(y)))
{
if((3+rel[x]-rel[y])%3!=(d-1))
return 1;
return 0;
}
else
{
uset[ux]=uy;
rel[ux]=(3-rel[x]+d-1+rel[y])%3;
return 0;
}
} int main()
{
int n,k;
scanf("%d%d",&n,&k); int d,x,y,cnt=0;
for(int i=1;i<=n;i++)
{
uset[i]=i;
rel[i]=0;
}
for(int i=0;i<k;i++)
{
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n||(d==2&&x==y))
cnt++;
else if(make_uset(x,y,d))
cnt++;
} printf("%d\n",cnt); return 0;
}
POJ 1182 (经典食物链 /并查集扩展)的更多相关文章
- poj 1182 (带权并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 71361 Accepted: 21131 Description ...
- 洛谷 P2024 食物链 POJ 1182 Label:并查集Turbo
题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...
- 食物链 POJ 1182(种类并查集)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- POJ1182 食物链---(经典种类并查集)
题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- poj 1611 :The Suspects经典的并查集题目
Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized ...
- 编程算法 - 食物链 并查集 代码(C)
食物链 并查集 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有N仅仅动物, 分别编号为1,2,...,N. 全部动物都属于A,B,C中的一种 ...
- POJ - 1182 食物链 并查集经典
思路:设r(x)表示节点x与根结点的关系,px表示x的根结点.记录每个节点与其父节点的关系,就能很方便知道每个节点以及和它的父节点的关系. struct node{ int par; //父亲节点 i ...
- POJ 1182 食物链 [并查集 带权并查集 开拓思路]
传送门 P - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit ...
- poj 1182 食物链 并查集 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=1182 题解 可以考虑使用并查集解决 但是并不是简单的记录是否同一组的这般使用 每个动物都有三个并查集 自己 天敌 捕食 并查集 那么在获得 ...
随机推荐
- POJ 1442 Black Box 堆
题目: http://poj.org/problem?id=1442 开始用二叉排序树写的,TLE了,改成优先队列,过了.. 两个版本都贴一下吧,赚稿费.. #include <stdio.h& ...
- Mac双系统切换
苹果系统和WIN7系统 切换和使用说明 先按住“alt(opfion)”不放手,然后在按开机键,会进入选择页面,选择win8 会进入 windos页面 ,选择MACintos h HD(Mac)会进 ...
- 我新买的红米手机,新浪和360浏览器都能进,也能看电视,就是不能上手机QQ和微信
1.请您在桌面下.点击手菜单键-全局搜索,输入网络助手,点击流量排行,点击批量联网控制,查看该软件下(不能上网的应用)wifi和流量2G/3G下方的选项是否都勾选的.如果没有勾选,请您勾选. 2:仍然 ...
- [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开
一.程序错误 编译错误,即语法错误.程序就无法被生成运行代码. 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数 ...
- Delphi XML-RPC 中文乱码解决方法
http://download.csdn.net/user/csm2432/uploads/2
- STL set multiset map multimap unordered_set unordered_map example
I decide to write to my blogs in English. When I meet something hard to depict, I'll add some Chines ...
- WCF Host中的BaseAddress 和 Endpoint中的Address的区别
http://stackoverflow.com/questions/18720810/wcf-service-base-address-vs-endpoint-address baseAddress ...
- BZOJ_1003_[ZJOI2006]_物流运输_(动态规划+最短路)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1003 m个码头,从1运货到m,n天每天运,其中有一些码头在特定的天里不能使用.运货的代价:在两 ...
- PHP手册 – 变量和常量
变量 php中变量的定义,就是就在某一个单词前面加上"\(".这是php的特色,**我想到的一个好处就是和常量做区分.另外,linux的shell编程中,\)有取值的意思.**.赋 ...
- UIImagePickerController 如何显示中文界面
1: 添加中文的 Localizations Project --> Info --> Localizations 添加 "Chinese(Simplified)" ...