这周主要看的图论的相关知识,,看了树状数组与其他算法结合的题型总结以温习为主,但也学了点拓展的算法,比如floyd判圈之类的小算法,还挺好玩的。
floyd判圈也叫龟兔赛跑算法,本质其实就是双指针的操作,比如在一个图中,顶点x到y有序,顶点y到z也是相同的顺序,那么x到z也存在这个顺序。这时候如果出现x到x的顺序,就说明了图里有环,可以解决判断环以及找环的入口的问题,复杂度O(m+n),虽然没有DFS或者检测顶点的出度速度快,但胜在代码简单,好理解。
贴一下板子:
//判断入环开始的点
template <class Node>
Node *panCyc(Node *first) {
Node *slow=first/*慢指针*/, *fast=first/*快指针*/;
//判断是否存在环路
do
{
if (!fast||!fast->next) return nullptr;
fast=fast->next->next;//fast需跳两下
slow=slow->next;
}
while(fast!=slow);
fast=first;
while (fast!=slow)//一步一步走再次相遇就是环的开始
{
slow=slow->next;
fast=fast->next;
}
return fast;
}
关于树状数组其实是上上周看的博客,当时只是模拟了一下板子没有与其他题目什么的结合,博客里的例题基本都是树状数组的区间和啥的(本来树状数组就是做这个的),还有树状数组与二分结合的例题。
上周日晚上有一场codeforces之后就一直没遇到比较合适的比赛,除去看博客就是搞codeforces800-1200的题,一方面是锻炼一下读题能力,另一方面题目比较多元,涉及比较广。马上就十一月,十一月的专题任务也发出来了,先从头开始看吧,下周看莫队算法。