树
文章平均质量分 79
冷月残星
这个作者很懒,什么都没留下…
展开
-
表达式树(公共表达式消除 uva 12219)
一共写了3遍,2遍超时,第三遍看了别人的代码才写出来的。。。第一遍,直接保存整颗子树,也就是整个子表达式。为了得到子表达式的值,我频繁调用substr函数。为了找到分隔左右子表达式的逗号,我直接遍历子表达式。最后用map去映射。结果超时。。后来看了下紫书,说不能保存整颗子树。。说比较两棵树的时间复杂度是O(n),循环枚举两颗子树,总时间复杂度高达O(n^3)。转载 2016-07-17 00:32:51 · 1724 阅读 · 0 评论 -
枚举,bfs(FZU 2150,Fire Game)
主要是通过这道题目思考了很多关于树,图的直径,中心等问题。以下内容跟本题解法弱相关。说到树的直径(树上最远点对),基本上就是最经典的树形dp了,但是紫书上还介绍了一种很不错的方法,两遍dfs。详见紫书p282。网上找的详解及证明:http://blog.sina.com.cn/s/blog_dbe928200101cm5t.html我觉得图应该也是一样的道理原创 2017-05-05 20:19:41 · 338 阅读 · 0 评论 -
树形DP(Simple Tree,玲珑杯 Round#8 B lonlife 1080)
一开始总觉得是dfs序之类的问题,子树中的数量很好解决,一直在思考如何往上求数量。很久后才注意到边带权,然后只好放弃dfs序,只能考虑树形DP了。然后就是经典的求树的直径的改造。然后写搓了(大概就是第一遍dfs的时候维护的量不够多,所以在第二次dfs时就得用更多的运算量去弥补,即没有用更多的空间去换时间,所以超时了,以前这么写都能过啊,这次就不行了,更重要的是自己写得很不熟练,很多细节都搞错了,W原创 2017-01-14 16:31:28 · 259 阅读 · 0 评论 -
树分治(Tree,poj 1741)
参考博客 http://www.cnblogs.com/kuangbin/p/3454883.html参考论文 http://wenku.baidu.com/link?url=DusTYd_4dgXuIS_G88sIwkAzGc5oM3CRzwx0EZcEWeiOtBh9Va2Xywzm_jhdeYkJ2E25Af9JWlB_PzLGDm0BVxVzYXyArOPJHOZ275YtFB转载 2016-10-16 22:55:55 · 296 阅读 · 0 评论 -
字典树,数学(Revenge of Fibonacci,hdu 4099)
不知到怎么回事,现在网上题解的代码大部分都会MLE。改成离线算法,就OK了。#includeusing namespace std;vectorvec;struct Node{ int id; Node* next[10]; Node() { id=-1; memset(next,0,sizeof(原创 2016-10-13 23:58:39 · 262 阅读 · 0 评论 -
树(网络,LA 3902)
可能是因为做了很多树形DP,而很少做其他题的缘故,我总希望通过一遍或几遍DFS来完成预处理以及计算答案。这样的思路是十分狭隘的。一开始想让树的重心或者中心来做根,然后dfs下去,找到一个最上面的点做服务器,使得下面所有叶子都能被照顾到。但是这样的话如何判断这个点以上的叶子是否被照顾到就十分难以解决。而且已有的那个服务器还会带来额外的麻烦。自己对这种题目的应对实在是太死板了。有一个值得学习的原创 2016-10-24 15:41:21 · 253 阅读 · 0 评论 -
哈夫曼编码,元素为指针的优先队列
http://blog.csdn.net/huangxy10/article/details/80299623.下面是将指针存在优先队列中的方式struct Node{ short f; short d; short fishs; short times; short i;}; struct PCmp{ b转载 2016-08-23 04:25:33 · 1036 阅读 · 0 评论 -
哈夫曼编码(Add All,uva 10954)
#includeusing namespace std;typedef long long ll;struct cmp{ bool operator () (ll a,ll b) { return a>b; }};int main(){ ll N; while(scanf("%lld",&N)==1&&N) {原创 2016-09-12 17:32:55 · 287 阅读 · 0 评论 -
树形dp(Centroids,cf 708C)
dp[i][j]表示:i等于0时,表示j往下(包括j)点的数量。i等于1时,表示j往上(不包括j)点的数量。qie[i][j]表示:i等于0时,表示j往下(包括j)能切的最大值。i等于1时,表示j往上(不包括j)能切的最大值。显然最大值往下就包括,往上就不包括。这是一个非常好的方法,细细体会。dfs时可以先枚举子节点进行dp,然后再dfs。可以解决许多难以求原创 2016-09-01 03:57:03 · 292 阅读 · 0 评论 -
树(Persistent Bookcase,cf 707d)
觉得无非就是存起来或者原路找回去。存起来需要太多的空间,肯定不行的。讲道理,原路找回去好难编程实现,一会往前一会往后,而且多走了很多路。这就是为什么要用某种数据结构建模的原因吧。真的能显著降低编程难度,而且思路十分清晰。看到这种回溯的东西,应该要想到树的。。。用了树之后访问顺序有所变化,但这反而少走了很多路。建模思想还不够吧。。。n个点的多叉树,必有n-转载 2016-08-21 19:13:39 · 310 阅读 · 0 评论 -
【2016-大连赛区网络赛-J】线段树,dfs(Weak Pair,hdu 5877)
http://blog.csdn.net/libin66/article/details/52497502水平还是太差了,以前一直做水题,然而网络赛的题都是有些难度的,自己做了一个下午才AC。比赛时有一个想法,实现了,理论上也不会超时,但是还是TLE了,不知道为啥。具体方法就是写一个表达式树,每个数字代表一个节点,从而此数字后面的所有数字都是它的子节点。从后往前枚举每个数字,对转载 2016-09-11 19:29:58 · 350 阅读 · 0 评论 -
最小生成树(星际游击队,uva 1279)
真的醉了。。。写了好久,然后WA。万念俱灰,抱着搞笑的心态改了一行代码,决定WA一发然后睡觉去。。改的是这个typedef long long ll;改成typedef double ll;然后交了,准备放弃。。然后AC了。。。当时就是觉得会不会long long不够大啊改成double虽然精度更低了但是能表示的数更大了,而且在数极大的情况下原创 2016-08-06 00:34:00 · 627 阅读 · 0 评论 -
最小生成树,Kruskal(买还是建 uva 1151)
用并查集合并集合时,不能直接p[net[t][i]]=net[t][1];而要int u=net[t][i];int v=net[t][1];int xx=find(u);int yy=find(v);if(xx!=yy) p[xx]=yy;附上代码#include#include#include#defin原创 2016-07-17 15:21:31 · 403 阅读 · 0 评论 -
最小生成树(苗条生成树 uva 1395)
#include#include#define maxn 10010#define INF 0X3F3F3F3Fusing namespace std;int u[maxn],v[maxn],w[maxn],p[maxn],r[maxn];int n,m;int cmp(const int i,const int j){return w[i]<w[j];}int find(in原创 2016-07-17 02:37:36 · 413 阅读 · 1 评论 -
树上记忆化搜索(Crazy Bobo,HDU 5325)
树形DP,就是在树上进行动态规划,这要求树是一个有向无环图。对于大部分题目而言,要么给你一棵有向树(又称有根树)(同时也是一个有向无环图),要么给你一棵无向树,你可以根据需要转化成有向树(又称有根树)(同时也是一个有向无环图)来处理。具体处理方式就是一遍,两遍,甚至多遍dfs。本题的话,我们可以用有方向的树来建模,虽然这棵树是一个有向无环图,但它不是一棵有向树(有根树),所以常规的dfs方法没原创 2017-06-09 14:14:44 · 379 阅读 · 0 评论