(參考他人资料)

向量偏移——由“食物链”引发的总结

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 (经典食物链 /并查集扩展)的更多相关文章

  1. poj 1182 (带权并查集)

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

  2. 洛谷 P2024 食物链 POJ 1182 Label:并查集Turbo

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  3. 食物链 POJ 1182(种类并查集)

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  4. POJ1182 食物链---(经典种类并查集)

    题目链接:http://poj.org/problem?id=1182   食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  5. poj 1611 :The Suspects经典的并查集题目

    Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized ...

  6. 编程算法 - 食物链 并查集 代码(C)

    食物链 并查集 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有N仅仅动物, 分别编号为1,2,...,N. 全部动物都属于A,B,C中的一种 ...

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

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

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

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

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

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

随机推荐

  1. Axure草记

    页面控件和DataSet绑定,DataSet和输入控件绑定(通过临时变量) 双击Repeater进入之后,你会发现下面已经默认添加了3行,这代表着,每增加一行将会重复3遍: Repeater可以只是部 ...

  2. UIStackView 简单使用

    UIStackView提供了一个高效的接口用于平铺一行或一列的视图组合.对于嵌入到StackView的视图,你不用再添加自动布局的约束了.Stack View管理这些子视图的布局,并帮你自动布局约束. ...

  3. C++const与指针

    1.指向常量的指针变量 指向常量的指针变量的定义方法: const 类型标识符 *指针变量名: 如:  const int *p; 这种方法定义的指针变量只可读取它所指向的变量或常量的值,不可借助该指 ...

  4. 降维(一)----说说主成分分析(PCA)的源头

    降维(一)----说说主成分分析(PCA)的源头 降维系列: 降维(一)----说说主成分分析(PCA)的源头 降维(二)----Laplacian Eigenmaps --------------- ...

  5. 如何使用 Cloud Insight SDK 实现 Druid 监控?

    Druid 简介与用途 首先说明,这里所说的 Druid 并不是阿里巴巴的数据库连接池项目,而是 Eric Tschetter 创立的一个开源的分布式实时处理系统,希望为烧钱的大数据处理,提供一种更廉 ...

  6. POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)

    点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R  ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...

  7. Jquery UI dialog 传参

    [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/3519318.html] $("#dialog").dialog({ aut ...

  8. Android自定义View带有删除按钮的EditText

    转载请注明出处http://blog.csdn.net/xiaanming/article/details/11066685 今天给大家带来一个很实用的小控件ClearEditText,就是在Andr ...

  9. ListView getView中放置多个item和getItemViewType的用法

    ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果我们 ...

  10. Java 多维数组 按某列 排序

        public MetaCell[][] getByColumn(final int columnIndex, int decisionIndex) {//[注意]final咯          ...