`

poj 1182

 
阅读更多

建议:做此题之前先做 poj 2524 poj 1611。这两道题都是并查集的基础应用。
关键词:并查集 相对关系
思路:(用一个并查集就够了同时对每个节点保持其到根结点的相对类别偏移量
  1.
father[x]表示x的根结点。rank[x]表示father[x]x的关系。rank[x] == 0 表示father[x]x同类;1表示father[x]x2表示xfather[x]

2.怎样划分一个集合呢?
  
注意,这里不是根据xfather[x]是否是同类来划分。而是根据“xfather[x]能否确定两者之间的关系来划分,若能确定xfather[x]的关系,则它们同属一个集合。

3.怎样判断一句话是不是假话?
        
假设已读入 D , X , Y , 先利用find_set()函数得到X , Y 所在集合的代表元素 xf ,yf ,若它们在同一集合(即 xf == yf )则可以判断这句话的真伪( 2. .
       
D == 1 rank[X] != rank[Y] 则此话为假。(D == 1 表示XY为同类,而从rank[X] != rank[Y]可以推出 X Y 不同类。矛盾。)

       
D == 2 rank[X] == rank[Y] X Y为同类)或者 rank[X] == ( rank[Y] + 1 ) % 3 YX )则此话为假。

4.上个问题中 r[X] == ( r[Y] + 1 ) % 3这个式子怎样推来?假设有YX,那么r[X]r[Y]的值是怎样的?
 
我们来列举一下:  r[X] = 0 && r[Y] = 2
                               r[X] = 1 && r[Y] = 0
                               r[X] = 2 && r[Y] = 1
  
稍微观察一下就知道r[X] = ( r[Y] + 1 ) % 3;事实上,对于上个问题有更一般的判断方法:

  
( r[Y] - r[X] + 3 ) % 3 != D - 1 ,则此话为假。(来自poj 1182中的Discuss

5、注意事项:

A我们x--r-->y表示xy之间的关系是r,比如x--1--y代表xy。现在,若已知x--r1-->yy--r2-->z,如何求x--?-->z?,于是我们不难发现,x--(r1+r2)%3-->z。这个就是在Find_Setint x)函数中用到的更新xfather[X]的关系

B、当D X Y时,则应合并X的根节点和Y的根节点,同时修改各自的rank。那么问题来了,合并了之后,被合并的根节点的kind值如何变化呢?
现有xydxy的关系,xfyf分别是xy的根节点,于是我们有x--rank[x]-->xfy--rank[y]-->yf,显然我们可以得到xf--(3-rank[x])-->xyf--(3-rank[y])-->y。假如合并后x为新的树的根节点,那么原先fx树上的节点不需变化,yf树则需改变了,因为rank值为该节点和树根的关系。这里只改变rank(yf)即可,因为在进行find_set操作时可相应改变yf树的所有节点的kind值。于是问题变成了yf--?-->xf。我们不难发现yf--(3-rank[y])-->y--(3-d)-->x--rank[x]-->xf,根据前面的结论,我们有yf--(3-rank[y])-->y--(3-d)-->x--rank[x]-->xf。我们求解了xfyf的关系了。

 代码如下:

#include <iostream>
const int MAX=50005;

int father[MAX];
int rank[MAX];


//初始化集合 
void Make_Sent(int x)
{
    father[x]=x;
    rank[x]=0;
}

//查找x的集合,回溯时压缩路径,并修改x与father[x]的关系 
int Find_set(int x)
{
    int t; 
    if(x!=father[x])
    {
        t = father[x];
        father[x]= Find_set(father[x]);
        //更新x与father[X]的关系 
        rank[x] = (rank[x]+rank[t])%3;
    }
    return father[x];
}

//合并x,y所在的集合 
void Union(int x,int y,int d)
{
    int xf = Find_set(x);
    int yf = Find_set(y);
    //将集合xf合并到yf集合上 
    father[xf] = yf;
    //更新 xf 与father[xf]的关系 
    rank[xf]=(rank[y]-rank[x]+3+d)%3;
}


int main()
{
    int totle=0;
    int i,n,k,x,y,d,xf,yf;
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;++i)
		Make_Sent(i);
    while(k--)
    {
        scanf("%d%d%d",&d,&x,&y);
        //如果x或y比n大,或x吃x,是假话 
        if(x>n||y>n||(d==2 && x == y))
        {
            totle++;                 
        }
        else
        {
            xf = Find_set(x);
            yf = Find_set(y);
            //如果x,f的父节点相同 ,那么可以判断给出的关系是否正确的 
            if(xf == yf)
            {
                if((rank[x]-rank[y]+3)%3 != d-1)
                    totle++;                              
            }
            else
            {
                //否则合并x,y 
                Union(x,y,d-1);
            }
        }
    }
    printf("%d\n",totle);
    system("pause");
	return 0;
}


 

 

 

 

分享到:
评论

相关推荐

    poj题目代码

    9. poj_1182.c - "Prime String":涉及素数判断和字符串处理,是基础数学与字符串算法的结合。 10. poj_1744.c - "Array Division":可能需要处理数组的分割和求和问题,对于理解和优化循环及数组操作有帮助。 每...

    POJ上三百多道题目程序源码

    7. "1182"对应第1182题。 8. "1321"对应第1321题。 9. "1547"对应第1547题。 10. "3224"对应第3224题。 每一道POJ题目通常会涉及特定的算法或编程挑战,例如数值计算、字符串处理、图论问题、动态规划、贪心策略等...

    POJ 100题代码

    3. 题目1182《Prime Number Game》:该题考察质数判断和最小公倍数。理解质数的定义,使用埃拉托斯特尼筛法筛选质数,再结合数学知识求解最小公倍数,是解题思路。 4. 题目1321《Minimum Operations》:这是一道...

    ACM 比赛 POJ的训练计划,,,非常不错,关键在于坚持

    第八类是并查集,涵盖了至少两个题目,包括 1861 和 1182 等题目。 第九类是快速查找,涵盖了至少三个题目,包括 2503 和 2513 等题目。 第十类是数论,涵盖了至少两个题目,包括 1061 和 1422 等题目。 第十一类...

    POJ 300多题AC代码

    【压缩包子文件的文件名称列表】如1472、1331、2472、3632、2115、1045、2141、2983、1423、1182等,这些数字通常是POJ平台上各道题目的编号,代表了具体的编程问题。例如: 1472可能是关于数据结构(如二叉树或图...

    poj推荐50题

    - **1861** 和 **1182** 两题是并查集的典型题目,适合初学者入门。 - **1308** 和 **2524** 这两道题目则提供了一些更具挑战性的练习,帮助学习者深入了解并查集的应用。 ### 第九类:快速查找(B-Search, Hash and...

    POJ PKU 必做题+部分难题1001-2500

    1011,1012,1013,1014,1015,1017,1026,1028,1032,1035,1041,1046,1129 1149 1154 1165 1182 1185 1190 1191 1201 1251 1273 1275 1276 1286 1322 1338 1363 1364 1401 1456 1459 1564 1579 1637 1657 1658 ...

    POJ1000-1299中的80题AC代码

    从压缩包子文件的文件名称列表来看,我们可以看到一些具体的题目编号,例如1000、1042、1273、1129、1182、1012、1002、1068、1159和1287。这些编号通常对应着POJ上的题目ID,每个ID后面可能代表一个特定的算法或...

    POJ上的ACM题目分类

    - 包括链表、队列、栈、树、图等数据结构的操作,如1182、1656等,可能涉及到查找、插入、删除等操作。 6. **动态规划**: - 动态规划是通过构建状态转移方程解决最优化问题,如1037、1050等题目,通常要求找出最...

    acm poj 源代码

    1001 1002 1003 1004 1005 1006 1007 1008 1011 1012 1013 1014 1015 1017 ...1182 1189 1190 1191 1195 1207 1218 1221 1251 1256 1258 1276 1287 1298 1306 1308 1316 1321 1322 1323 1324 1338 1354 1376 1401 1416 ...

    poj pku 解题报告

    1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1011 1012 1013 1014 ...1182 1183 1186 1188 1189 1190 1191 1195 1200 1201 1207 1218 1226 1251 1256 1258 1260 1273 1274 1276 1283 1298 1305 1306 1308 1315 ...

    poj题目分类

    题目编号如1182、1656、2021等,图论是研究图的性质和结构的一门学科,图由顶点和边组成,可以用来模拟网络、交通系统、社交关系等现实世界中的问题。图论中的基本概念有邻接矩阵、邻接表、连通性、最短路径、最小...

    POJ分类[文].pdf

    - 包括容易、不易和推荐难度的题目,如1182(链表操作)、1656(树的遍历)等,数据结构的熟练掌握对于解决这类问题至关重要,包括栈、队列、树、图等。 6. **动态规划**: - 动态规划是一种解决最优化问题的有效...

    poj135道题的代码

    1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1011 1012 1013 1014 ...1182 1188 1189 1190 1207 1218 1256 1258 1273 1298 1305 1308 1319 1321 1323 1328 1339 1401 1422 1455 1458 1477 1562 1564 1565 1579 ...

    NOIP NOI 信息学竞赛 ACM-ICPC POJ(北京大学在线评测系统)刷题推荐 OI复习计划 算法大纲

    并查集用于处理不相交集合的合并与查询,如1861、1182、1308、2524等。 9. **快速查找**(Quick Search) 包括二分查找、哈希等,如2503、2513、1035、1200、2002等。 10. **数论**(Number Theory) 数论在...

    并查集C++实现

    这份代码用C++实现了经典算法并查集,来源于poj题目1182

    算法学习攻略

    8. **并查集**:用于处理集合合并和查询问题,推荐1861、1182和1308、2524等题目。 9. **快速查找**:包括二分查找和哈希等高效查找技术,如2503、2513(Euler回路的判定)、1035、1200和2002。 10. **数论**:...

    北大ACM 题目分类

    数据结构是算法设计的基础,POJ平台上提供了大量涉及数据结构的题目,如1182号题和2021号题,这些题目旨在帮助学生掌握不同类型的数据结构及其操作方法。更复杂的题目,如1145号题和1177号题,则要求参赛者具备更高...

    动态规划.ppt,还有一些推荐的题目

    举例来说,树型动态规划问题如FZU1022、POJ1192和POJ3107等,集合型问题如ZJU1651、COJ1296和POJ2411,以及其他类型的问题如COJ1182、POJ3486等,都可以通过动态规划求解。 动态规划的优势在于其效率,尤其是对比...

    北京大学acm题库 题目分类

    北京大学ACM题库分类是适合想做ACM题的人的题目分类,分类详细,涵盖了POJ(PKU ACM Online Judge)上的题目分类。该分类涵盖了多种算法和数据结构,包括排序、搜索、回溯、遍历、历法、枚举、数据结构的典型算法、...

Global site tag (gtag.js) - Google Analytics