随笔分类 -  数据结构——字典树 并查集 拓扑

摘要:为什么选择跳表目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。用... 阅读全文
posted @ 2015-03-20 10:57 E_star 阅读(229) 评论(0) 推荐(0) 编辑
摘要:题意:有n个龙珠,分别存放在编号为1-n的城市里面。然后进行如下操作,T,a,b将a龙珠所在城市的所有龙珠都转移到b龙珠所在的城市,Q,a输出a龙珠所在的城市,以及该城市一共有多少个龙珠,同时输出该龙珠被转移的次数,思路:并查集,前两项比较好像,后一项记录转移次数,我们只需要记录每一个点到达父节点所需的转移次数no[i]然后再路径压缩的时候求一个和,压缩完成后该点的no值就是该点的转移次数了。View Code #include <iostream>#include <cstdio>#include <cmath>#include <vector> 阅读全文
posted @ 2013-05-10 08:50 E_star 阅读(255) 评论(0) 推荐(0) 编辑
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2497题意:给你一个图,检查该图中的每一个环是否都包含了s点,若每一个环都包含的s点输出YES,否则输出NO思路:比赛的时候自己用并查集处理的,可是没有想到关键的处理点。。。。。正确思路:如果存在包括s的环的话,那么肯定是从s出发又回到s的,所以我们完全没有必要将s加入集合。只把与s无关的点边进行处理,如果存在环那么这个环肯定不包含s,那么肯定输出NO,否则是就输出YES。话说这题爆搜也能过,数据弱了点。。并查集处理:#include < 阅读全文
posted @ 2012-12-03 18:31 E_star 阅读(171) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.com/problemset/problem/216/B题意:有n个人,要求你将他们平均分成两组进行球赛。给出m个敌对关系,每个人最多有两个敌对的人,属于敌对关系的两个人不能分到同一小组里面。输出不能被分到两个小组最少人数。思路:和poj的食物链题目类似,这里利用并查集的长度记录关系,每出现一个敌对关系就将他们合并。距离为0表示可以属于同一组,1表示是敌对关系。当出现的两个敌对关系在之前已经确定为同类关系,必然将其剔除。记录剔除的个数,最后检查剔除这些人之后的人数是偶数。View Code #include <iostream>#include 阅读全文
posted @ 2012-10-25 18:18 E_star 阅读(393) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.com/problemset/problem/4/C题意:一个注册系统,给出n个注册的名字,每次检查数据库中是否存在该名字,如果不存在返回OK,加入数据库,否如果存在在该名字后边加1,2,3,,,....然后加入数据库。思路:暴力存储查询可过,用字典数存处名字可过,哈希存储查找可过。暴力:View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#incl 阅读全文
posted @ 2012-10-24 19:03 E_star 阅读(219) 评论(0) 推荐(0) 编辑
摘要:普通的并查集:pku 1308Is It A Tree?http://poj.org/problem?id=1308判断点的关系是否满足是一棵树,这里考察细节,注意:1:空的也是树;2:注意可能形成森林,森林就不是所描述的树了View Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include < 阅读全文
posted @ 2012-10-05 19:32 E_star 阅读(1144) 评论(0) 推荐(1) 编辑
摘要:http://poj.org/problem?id=2492题意:专家研究一种病毒,发现他们只与异性发生性关系。问题:查看他们是否具有同性恋关系,给出n个病毒编号从1-n,给出q中关系,每种关系x,y表示x与y有性行为,即表示他们属于异性,输出这群病毒是否具有异性关系。思路:并查集的基本作用是用来区分不同的集合关系,相同的加入同一集合,不同的则不处理。这里给出x,y的不同关系,让你判断是否是相同集合,这里我们只要把相同的合并即可,另开一个数组记录与x不同的集合的代表(只要一个点即可代表整个与x不同的集合),只要遇到x,y不同我们就把x与opt[y] y与opt[x]合并即可,这样属于同一集合的 阅读全文
posted @ 2012-07-31 10:10 E_star 阅读(188) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2418字典数编号,统计每个单词出现的次数,然后计算频率:View Code #include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#define maxn 10007using namespace std;struct node{ int flag; node *next[100];}*head,H[999999];int pos;int L;struct 阅读全文
posted @ 2012-04-06 21:56 E_star 阅读(205) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2513才开始自己对欧拉路的理解成了汉密尔顿路;欧拉路:给定无孤立节点的图G,(连通图),若存在一条路,经过图中每边一次且仅一次,该条路是欧拉路;汉密尔顿路则是:给定无孤立节点的图G,(连通图),若存在一条路,经过图中每点一次且仅一次,该条路是汉密尔顿路;这样用字典树映射字符串的编号,并查集判断连通,欧拉路判断:1 :必须是连通图;2:有0个或2个奇数度数的节点View Code #include <cstdio>#include <cstring>#include <queue>#include < 阅读全文
posted @ 2012-04-02 22:12 E_star 阅读(230) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2503很简单的一个哈希,本来想求和然后模一个数哈希呢,提交果断tle。。。郁闷。最后看了看别人的哈希,在处理的时候好像用到了经典的unix的ELF哈希函数给输入字符串生产哈希值.我直接套的这个函数,提交就A了。。。unix的ELF哈希函数View Code unsigned int ELFHash(char* str){ unsigned int hash = 0; unsigned int x = 0; while (*str){ hash = (hash << 4) + (*str++); ... 阅读全文
posted @ 2012-03-31 10:12 E_star 阅读(177) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2002首先枚举正方形的任意两点,然后有由这两点确定其他两点,确定后再到给定的点中做二分查找如果都存在,则找到了一个正方形。首先排序,然后查找,记住这里重复计算了,要除以2推导过程转载自:http://blog.csdn.net/zsc09_leaf/article/details/6204705公式推导://如图所示,正方形的四个点分别为(x1,y1),(x2,y2),(x3,y3),(x4,y4)//假设一开始给出的点为(x1,y1),(x2,y2)且已排序//根据全等三角形,可以得知2个蓝色△全等,2个红色△全等(注:此处也可推右边的正 阅读全文
posted @ 2012-03-30 11:50 E_star 阅读(259) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1840刚拿到这道题时,想到的肯定是暴力枚举啊。肯定超时。想到了立方乘系数,如果再枚举的话,还是会超时的。。无语。。最后看了看了结题报告。。果然霸气。。。思维还是不够灵活是。。将式子a1*x1^3 +a2*x2^3 + a3 * x3^3 + a4 * x4^3 + a5 * x5^3 = 0;转化成a1*x1^3 +a2*x2^3 + a3 * x3^3 = - a4 * x4^3 - a5 * x5^3两边相等,将左边的数利用hash建立映射,然后枚举右边的数和利用hash查找。。。开散列:挂链 891msView Code #inclu 阅读全文
posted @ 2012-03-29 19:55 E_star 阅读(196) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3274看到这个题的时候直接给理解错了,以为求存在第k个属性,的牛的个数,直接谢了个排序+二分查找样例过了一交WA了。。心情很郁闷。。自己完全把题意理解错了。题意是求满足i到j 的差值最大且i到j牛的前k个属性每种属性求和,并且和要相等。求出最大的j - i;sum[i][j] 表示从第一头牛到第i头牛拥有j属性的牛的个数,则根据题意有,如果i -> j 最大则有sum[j][0] - sum[i][0] = sum[j][1] - sum[i][1] = sum[j][2] - sum[i][2] = .......... = sum 阅读全文
posted @ 2012-03-27 21:56 E_star 阅读(247) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3349用开散列的方式处理哈希,才开始的时候,在isok判断两个雪花是否行等时,我错认为只要找到一个相同的数字,然后顺时针逆时针寻找如果没能查找到就算是不想等了,两组数据可能有形同的数字不知一个,所以在这里贡献了好几次WA.笨啊。。。例如数据:21 2 3 2 4 52 4 5 1 2 3应该是相同的。。。挂链方式处理。。View Code #include <iostream>#include <cstdio>#include <cstring>#define maxn 177777using names 阅读全文
posted @ 2012-03-26 21:14 E_star 阅读(227) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1611思路:统计出和0能够联系在一起的点,然后输出其个数View Code #include <cstdio>#include <iostream>#define maxn 30004using namespace std;int f[maxn],num[maxn];//num记录与0有联系的个数int n,m;int find(int x){ if (x != f[x]) { f[x] = find(f[x]); } return f[x];}void Union(int x,int y){ x... 阅读全文
posted @ 2012-03-23 21:32 E_star 阅读(202) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3080学习:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html才开始自己,思路搞错了,先把前两个求最长公共子序列,然后依次用最长公共子序列与2,3,4,。。。m比较求最长公共子序列。。贡献了3次wa直到看到这组数句才发现自己的错误:13AAATTTGGGTTTGGGAAAGGGTTTAAAprint:AAA按我的思路会输出TTT的。。唉。。因为前两个最长公共子序列为TTTGGG再将它与第三组比较时,就出来TTT了。而第1,2组可以得到AAA然后在于第三组的AA 阅读全文
posted @ 2012-03-22 20:55 E_star 阅读(272) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3687本人强烈推荐这道题。。。才开始自己理解错了题意,以为单纯的利用优先队列每次从入度为0的队列中选出编号最小的点即可,样例过了可是无限WA最后看了看解题报告,原来我理解错了。要求序列小的要尽量靠前,而且输出的不是得到的序列,而是根据序列得到的重量。。很不错的解题报告,本人转载:在基本的拓扑排序的基础上又增加了一个要求:编号最小的节点要尽量排在前面;在满足上一个条件的基础上,编号第二小的节点要尽量排在前面;在满足前两个条件的基础上,编号第三小的节点要尽量排在前面……依此类推。(注意,这和字典序是两回事,不可以混淆。)如图1所示,满足要求的拓 阅读全文
posted @ 2012-03-14 21:03 E_star 阅读(261) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1094题意相当的坑爹,才开始我的步骤是:1 判断是否有环,如果存在环,就输出Inconsistency found after 2 relations.不能确定该序列大小2 如果不存在环,然后判断是否能够判断出唯一的该序列,每次去入读为0的点时,一定会有一个,而且最终取完。。。3 然后判断。可是Discuss里面的数据就是不过。。。于是看了看讨论。原来,只要在出现环之前,能够判断出该序列的顺序就输出顺序,后面的就只输入不处理了(不管了)。。。还有判断环的优先级要高于序列唯一性判断的优先级。。。这样的话要每输入一条边,就要进行一次拓扑排序,然 阅读全文
posted @ 2012-03-11 17:29 E_star 阅读(259) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2524题目分类是分治,我不知道怎么用分治。并查集1y.注意这里每个人最多有一个宗教信仰View Code #include <iostream>#include <cmath>#include <cstdio>#include <cstring>#define maxn 50007using namespace std;int f[maxn];int find(int x){ if (x != f[x]) f[x] = find(f[x]); return f[x];}void Union(i 阅读全文
posted @ 2012-02-24 21:51 E_star 阅读(165) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1198原来看解题报告做过的一道题,现在拾起来再做感觉还是有点难度,慢慢想想也就思路清晰了。首先发现通道只要相碰就能连接。结构体记录是否能够连接,把能连接的用并查集归为同一集合,不能连接的则属于不同的集合。最后统计几何数就欧了。。、View Code #include <cstdio>#include <cstring>#define MAXN 59struct node{ int up; int down; int left; int right;};node tagp[11]={ { 阅读全文
posted @ 2012-02-07 19:26 E_star 阅读(185) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示