hihocoder(1050) 树中最长路径
摘要:树的最长路径,即求一颗树的直径问题,dfs和bfs都可一解决,但一直觉得dfs的比较绕,不好理解。于是写了bfs的方法,其中0节点当作哨兵,每次从队列中取出0节点的时候,就知道一轮bfs结束,可以把深度加一。bfs的思路很简单:1.随便找一个节点,以该节点为起点进行一次bfs,得出的最后一个顶点,一...
阅读全文
hihocoder(1049) 后序遍历
摘要:常见题了,分治思想,有一个结论划分后,将序列划分为更小的子集,继续应用该结论。图简单,直接递归了,之前看过非递归的写法。。。忘了Impl: 1 #include 2 #include 3 4 using namespace std; 5 6 void postOrder(string str...
阅读全文
hihocoder(1038,1043) 01背包与完全背包
摘要:动态规划是一直感觉比较模糊的东西,虽然大致上知道是什么一回事,但是离灵活应用还差得远,但貌似比赛中动态规划的题出的特别多,这两个经典问题其实只能算是一个学习动态规划很好的模型。不过万事开头难,关键还是得静下心来多练习。01背包的状态转移式:f(i, j) = max{f(i-1, j), f(i-1...
阅读全文
hihocoder(1109) 堆优化的Prim算法
摘要:这题思路也很简单,就是用一个最大堆堆去维护Prim算法中的Low数组,把刷新Low数组的操作,变成了刷新堆的操作,由于堆的插入操作位logn,查询时间为常数,因此在边稀疏的情况下,其复杂度与Kruscal接近。这题刚开始老是WA,想了很久,不知道错在哪里,后来发现时因此不能直接去堆中的最小路径,因为...
阅读全文
hihocoder(1098) 最小生成树Kruskal
摘要:Kruskal比Prim简单的多,对已知边排序,然后从排序的边中跳出N-1条最短的来就可以了,当然,如果在挑的过程中出现环,就丢掉继续找,就只这么直接。如何判定有没有环?很简单,用并查集就可以。比如a-b,b-c,c-a构成了环,那么a-b合并,b-c合并后,如果紧接着最小边是c-a,那么并查集的f...
阅读全文
hihocoder(1097) 最小生成树Prim
摘要:图论一直是自己算法中最最最柔弱的部分,主要是,当年数据结构的课程,后面就去打酱油了,后来时间又都花在了电赛上,平时用的相关部又少,这一部分就更弱了,总是懒得捡起来,但是现在可是没退路了,开始好好复习这一部分。Prim算法是求解无向图最小生成树的经典算法,和Dijkstra算法类似,但是Prim算法每...
阅读全文
hihocoder(1032) 最长回文子串
摘要:经典题,没什么好说的,直接上manacher,时间复杂度O(n),空间复杂度O(n),因为需要额外申请一个数组存储每个位置的子回文长度。算法精髓:1.把无论奇,偶长度字符串转换为奇数个。2.利用已经得到的最长回文的右边界来减少重复计算的次数,如果右边界mx>i,则p[i] = min(mx-i, p...
阅读全文
hihocoder(1014) Trie树
摘要:Trie树又称单词查找树,多应用与搜索引擎或者输入法的词频统计,利用字符串的公共前缀加快查找速度。第一次接触,不过代码还是比较好写的。Impl: 1 #include 2 #include 3 #include 4 5 struct TrieTree 6 { 7 int count;...
阅读全文
hihocoder(1015) KMP
摘要:算法核心,Next数组(模式串的最长前缀后缀表)。KMP的思想就是,当匹配不正确时,模式串向后移动的距离为:已匹配的字符串个数 - next[j]而Next数组的算法起始也是递归的字符串匹配过程。Impl: 1 //Next数组计算 2 void CalNext(const char* p, int...
阅读全文