- 浏览: 202013 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (137)
- c++ (74)
- c++,算法,回溯 (2)
- DP问题。 (9)
- DP问题,0/1背包问题 (3)
- 数学问题 (6)
- 贪心算法 (10)
- 排序 (16)
- 数据结构 (7)
- 容器 (2)
- 模拟问题 (2)
- 水题 (8)
- 并查集 (3)
- 非技术 (2)
- 素数问题 (1)
- DFS (3)
- 二叉树 (1)
- 递归 (1)
- 图论 (5)
- 最小生成树 (5)
- 最短路径 (6)
- bell_flaod算法 (2)
- hash (3)
- 二分查找 (1)
- 搜索 (5)
- BFS (5)
- STL (3)
- 字符串hash (1)
- 拓扑排序 (1)
- 字典树 (4)
- 哈弗曼树 (1)
- KMP (7)
- 线段树 (9)
- 树状数组 (6)
- 全排列 (2)
- DP问题 (2)
- LCS (1)
- 最长不下降子序列 (2)
- 面试经验 (3)
建议:做此题之前先做 poj 2524 和 poj 1611。这两道题都是并查集的基础应用。
关键词:并查集 相对关系
思路:(用一个并查集就够了,同时对每个节点保持其到根结点的相对类别偏移量)
1.father[x]表示x的根结点。rank[x]表示father[x]与x的关系。rank[x] == 0 表示father[x]与x同类;1表示father[x]吃x;2表示x吃father[x]。
2.怎样划分一个集合呢?
注意,这里不是根据x与father[x]是否是同类来划分。而是根据“x与father[x]能否确定两者之间的关系”来划分,若能确定x与father[x]的关系,则它们同属一个集合。
3.怎样判断一句话是不是假话?
假设已读入 D , X , Y , 先利用find_set()函数得到X , Y 所在集合的代表元素 xf ,yf ,若它们在同一集合(即 xf == yf )则可以判断这句话的真伪( 据 2. ).
若 D == 1 而 rank[X] != rank[Y] 则此话为假。(D == 1 表示X与Y为同类,而从rank[X] != rank[Y]可以推出 X 与 Y 不同类。矛盾。)
若 D == 2 而 rank[X] == rank[Y] (X 与Y为同类)或者 rank[X] == ( rank[Y] + 1 ) % 3 (Y吃X )则此话为假。
4.上个问题中 r[X] == ( r[Y] + 1 ) % 3这个式子怎样推来?假设有Y吃X,那么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表示x和y之间的关系是r,比如x--1--y代表x吃y。现在,若已知x--r1-->y,y--r2-->z,如何求x--?-->z?,于是我们不难发现,x--(r1+r2)%3-->z。这个就是在Find_Set(int x)函数中用到的更新x与father[X]的关系
B、当D X Y时,则应合并X的根节点和Y的根节点,同时修改各自的rank。那么问题来了,合并了之后,被合并的根节点的kind值如何变化呢?
现有x和y,d为x和y的关系,xf和yf分别是x和y的根节点,于是我们有x--rank[x]-->xf,y--rank[y]-->yf,显然我们可以得到xf--(3-rank[x])-->x,yf--(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。我们求解了xf和yf的关系了。
代码如下:
#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;
}
发表评论
-
虚函数、纯虚函数、虚基类、抽象类、虚函数继承、虚继承
2013-08-29 14:34 836虚函数:虚函数是C++中用于实现多态(polymorphis ... -
排序算法总结
2013-05-17 11:00 841选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, ... -
poj 3122
2012-12-11 19:51 866题意:作者要开一个生日party,他现在拥有n块高度都为1 ... -
poj 3273
2012-12-11 16:49 982题意:给你天数n,和每天需要花的钱,让你把这些天分成m份(每份 ... -
poj 2492
2012-08-04 16:23 2038题意:Professor Hopper专门研究bug的生活习性 ... -
字典树学习材料
2012-05-30 14:29 967字典树,又称单词查找树,Trie树,是一种树形结构,典型应 ... -
poj 1159
2012-05-28 19:08 1441题目大意:给你一段字符串,让你求出在中间最少加入几个字符 ... -
poj 3176
2012-05-28 14:47 1016大致题意: 输入一个n层的三角形,第i层有i个数,求从第 ... -
poj 1260
2012-05-28 09:54 1610题意解释: 有n个等级的珠宝,等级依次升高,等级越高价钱越高 ... -
poj 1836
2012-05-28 09:22 2710是POJ2533的扩展题。题意不难,令到原队列 ... -
poj 2533
2012-05-26 15:36 1269在做这道题目之前,首先让我们了解一下什么是LIS算法,LIS俗 ... -
poj 3267
2012-05-26 09:43 801从程序可以看出,第i个位置到L所删除的字符数,总是先取最坏情况 ... -
poj 1276
2012-05-25 16:20 2392题意: 这道题的意思是给你一堆钱,各种面值的都有,比 ... -
poj 1094
2012-05-25 13:54 1107题意:给出字母个数,和有限个有序对(a<b)求出能确定字 ... -
poj 3393
2012-05-23 17:00 1256大致题意: 科普文一篇,文章80%都是无用信息,因为 ... -
poj 3007
2012-05-14 10:21 991大致题意: 给定一个字符串,从任意位置把它切为两半, ... -
poj 3096
2012-05-10 21:09 1003题意: 定义D-pairs表示取字符串s中相距为D的两个字母 ... -
poj 1426
2012-04-26 20:11 2170大致题意: 给出一个整数n,(1 <= n <= ... -
poj 1797
2012-04-24 15:05 1623题目大意是就是何处一个图,n个顶点和m条边,每个边都有最大承载 ... -
poj 1338
2012-04-23 10:20 1257题意:题目意思是求由2,3,5的乘积组成的数从大到小排列,从1 ...
相关推荐
9. poj_1182.c - "Prime String":涉及素数判断和字符串处理,是基础数学与字符串算法的结合。 10. poj_1744.c - "Array Division":可能需要处理数组的分割和求和问题,对于理解和优化循环及数组操作有帮助。 每...
7. "1182"对应第1182题。 8. "1321"对应第1321题。 9. "1547"对应第1547题。 10. "3224"对应第3224题。 每一道POJ题目通常会涉及特定的算法或编程挑战,例如数值计算、字符串处理、图论问题、动态规划、贪心策略等...
3. 题目1182《Prime Number Game》:该题考察质数判断和最小公倍数。理解质数的定义,使用埃拉托斯特尼筛法筛选质数,再结合数学知识求解最小公倍数,是解题思路。 4. 题目1321《Minimum Operations》:这是一道...
第八类是并查集,涵盖了至少两个题目,包括 1861 和 1182 等题目。 第九类是快速查找,涵盖了至少三个题目,包括 2503 和 2513 等题目。 第十类是数论,涵盖了至少两个题目,包括 1061 和 1422 等题目。 第十一类...
【压缩包子文件的文件名称列表】如1472、1331、2472、3632、2115、1045、2141、2983、1423、1182等,这些数字通常是POJ平台上各道题目的编号,代表了具体的编程问题。例如: 1472可能是关于数据结构(如二叉树或图...
- **1861** 和 **1182** 两题是并查集的典型题目,适合初学者入门。 - **1308** 和 **2524** 这两道题目则提供了一些更具挑战性的练习,帮助学习者深入了解并查集的应用。 ### 第九类:快速查找(B-Search, Hash and...
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 ...
从压缩包子文件的文件名称列表来看,我们可以看到一些具体的题目编号,例如1000、1042、1273、1129、1182、1012、1002、1068、1159和1287。这些编号通常对应着POJ上的题目ID,每个ID后面可能代表一个特定的算法或...
- 包括链表、队列、栈、树、图等数据结构的操作,如1182、1656等,可能涉及到查找、插入、删除等操作。 6. **动态规划**: - 动态规划是通过构建状态转移方程解决最优化问题,如1037、1050等题目,通常要求找出最...
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 ...
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 ...
题目编号如1182、1656、2021等,图论是研究图的性质和结构的一门学科,图由顶点和边组成,可以用来模拟网络、交通系统、社交关系等现实世界中的问题。图论中的基本概念有邻接矩阵、邻接表、连通性、最短路径、最小...
- 包括容易、不易和推荐难度的题目,如1182(链表操作)、1656(树的遍历)等,数据结构的熟练掌握对于解决这类问题至关重要,包括栈、队列、树、图等。 6. **动态规划**: - 动态规划是一种解决最优化问题的有效...
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 ...
并查集用于处理不相交集合的合并与查询,如1861、1182、1308、2524等。 9. **快速查找**(Quick Search) 包括二分查找、哈希等,如2503、2513、1035、1200、2002等。 10. **数论**(Number Theory) 数论在...
这份代码用C++实现了经典算法并查集,来源于poj题目1182
8. **并查集**:用于处理集合合并和查询问题,推荐1861、1182和1308、2524等题目。 9. **快速查找**:包括二分查找和哈希等高效查找技术,如2503、2513(Euler回路的判定)、1035、1200和2002。 10. **数论**:...
数据结构是算法设计的基础,POJ平台上提供了大量涉及数据结构的题目,如1182号题和2021号题,这些题目旨在帮助学生掌握不同类型的数据结构及其操作方法。更复杂的题目,如1145号题和1177号题,则要求参赛者具备更高...
举例来说,树型动态规划问题如FZU1022、POJ1192和POJ3107等,集合型问题如ZJU1651、COJ1296和POJ2411,以及其他类型的问题如COJ1182、POJ3486等,都可以通过动态规划求解。 动态规划的优势在于其效率,尤其是对比...
北京大学ACM题库分类是适合想做ACM题的人的题目分类,分类详细,涵盖了POJ(PKU ACM Online Judge)上的题目分类。该分类涵盖了多种算法和数据结构,包括排序、搜索、回溯、遍历、历法、枚举、数据结构的典型算法、...