随笔分类 -  2.————图论————

摘要:一定是从随便某个点开始,然后按着dfs序的顺序跑一圈是最好的 所以说,新加一个点x,就减少了dis(pre,next),增加了dis(pre,x),dis(x,nxt) 删掉一个点同理 这个可以用set维护 阅读全文
posted @ 2018-10-18 17:02 Ressed 阅读(199) 评论(0) 推荐(0)
摘要:我也想要皮卡丘 跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树 并不会支配树,只能简单口胡一下在DAG上的做法 建出来的支配树中,某点的祖先集就是从S到该点的必经点集,也就是说,炸掉某点,这个子树都会变得angryunhappy 大概就是按拓 阅读全文
posted @ 2018-10-18 16:56 Ressed 阅读(594) 评论(0) 推荐(0)
摘要:首先可以求出从某点做$2^k$次车能到的最浅的点,这个只要dfs一下,把它的孩子能到的最浅的点更新过来就可以 然后倍增地往上跳,不能跳到lca的上面,记录坐车的次数ans 此时有三种情况(设最远能跳到x,y): 1.再跳也跳不到lca的上面,就是-1 2.路径(x,y)被某趟车覆盖,答案是ans+1 阅读全文
posted @ 2018-10-18 16:47 Ressed 阅读(823) 评论(0) 推荐(0)
摘要:先用kruskal处理出一个最小生成树 对于非树边,倍增找出两端点间的最大边权-1就是答案 对于树边,如果它能被替代,就要有一条非树边,两端点在树上的路径覆盖了这条树边,而且边权不大于这条树边 这里可以树剖来做,但是不想用.. 如果先把非树边从小到大排序然后去覆盖树边,那么一条树边只需要被覆盖一次 阅读全文
posted @ 2018-10-18 16:32 Ressed 阅读(776) 评论(0) 推荐(0)
摘要:可以证明,如果合并两棵树,新的直径的端点一定是原来两树中直径的端点 可以把新加两个点的操作看成是把两个只有一个点的树合并到原来的树上,然后用其中的一个点去和原来树上的直径两端点更新直径就可以了 阅读全文
posted @ 2018-10-18 16:17 Ressed 阅读(475) 评论(0) 推荐(0)
摘要:先kruskal求出一个最小生成树,然后对于每条非树边(a,b),从树上找a到b路径上最大的边,来把它替换掉,就是包含这条边的最小生成树 阅读全文
posted @ 2018-10-18 16:00 Ressed 阅读(318) 评论(0) 推荐(0)
摘要:直接建图边数太多,用线段树优化一下 然后缩点,记下来每个点里有多少个炸弹 然后按拓扑序反向dp一下就行了 阅读全文
posted @ 2018-10-13 10:44 Ressed 阅读(189) 评论(0) 推荐(0)
摘要:我在做spfa的时候,如果有一个点被更新了超过N次,证明这个图里是有负环的。 (神TM输出YE5和N0) 阅读全文
posted @ 2018-10-13 10:35 Ressed 阅读(175) 评论(0) 推荐(0)
摘要:首先floyd求出来每两点间的最短距离,然后再求出来从某点买再到某点卖的最大收益 问题就变成了找到一个和的比值最大的环 所以做分数规划,二分出来那个答案r,把边权变成w[i]-r*l[i],再做spfa判正环就行了 (本来想偷懒用floyd判正环,结果T了) 阅读全文
posted @ 2018-10-13 10:33 Ressed 阅读(243) 评论(0) 推荐(0)
摘要:易证我们走的时候只会从某一层的某端点走向另一端点、然后走向下一层的某端点.. 所以建图然后dijkstra就行了 调了一年以后发现dijkstra写错了 阅读全文
posted @ 2018-10-13 10:26 Ressed 阅读(448) 评论(0) 推荐(0)
摘要:根为r时x、y的公共祖先,就是lca(x,r),lca(x,y),lca(r,y)中深度最大的那一个,不要再在倍增的时候判来判去还判不对了... 阅读全文
posted @ 2018-10-09 10:39 Ressed 阅读(114) 评论(0) 推荐(0)
摘要:dfs序后用线段树来记每个节点的前缀和 每次找一个前缀和最大的节点,然后把它到根的路径上的每个之前没被走过的点 对应的dfs序的区间 减掉那个点的权值 每个点最多被减一次,复杂度是$O(nlogn)$的 阅读全文
posted @ 2018-10-09 10:32 Ressed 阅读(214) 评论(0) 推荐(0)
摘要:由于有相同权值的边不超过10条的限制,所以可以暴搜 先做一遍kruskal,记录下来每个权值的边使用的数量(可以离散化一下) 可以证明,对于每个权值,所有的最小生成树中选择的数量是一样的、而且它们连成的连通块也是一样的 所以我们把每个权值的边分开暴搜所有可能的情况,最后再乘到一起就是答案 阅读全文
posted @ 2018-10-09 10:15 Ressed 阅读(195) 评论(0) 推荐(0)
摘要:(警告:本篇博客包含大量人类本质内容) 先处理出来lca,然后就只需要知道从每个点到他的父亲、和从他的父亲到这个点的期望时间就可以了 我们设f[x]为x到他父亲的期望时间;g[x]为从x的父亲到x的期望时间(注意到这两个是不一样的) 只考虑怎么算f,g是类似的 从某个点想走到他父亲时,情况会有:直接 阅读全文
posted @ 2018-10-06 20:57 Ressed 阅读(280) 评论(0) 推荐(0)
摘要:先二分出一个时间,把每个军队倍增往上跳到不能再跳 然后如果它能到1号点,就记下来它跳到1号点后剩余的时间;如果不能,就让它就地扎根,记一记它覆盖了哪些叶节点(我在这里用了dfs序+差分,其实直接dfs就行..) 然后对于那些叶节点没有被覆盖完全的(父亲为1号点的)子树,肯定需要一些已经到1号点的军队 阅读全文
posted @ 2018-10-01 20:09 Ressed 阅读(162) 评论(0) 推荐(0)
摘要:做dijkstra,但只需要贪心地把每个点连到它左边、右边、上边、下面的第一个点就可以了 阅读全文
posted @ 2018-10-01 19:56 Ressed 阅读(214) 评论(0) 推荐(0)
摘要:把一条路径拆成到根的四个链(两端点、lca和fa[lca]),然后给dfs序中链的端点做单点修改、区间查询它的子树和再加上它原来的权值就可以了 阅读全文
posted @ 2018-10-01 19:47 Ressed 阅读(189) 评论(0) 推荐(0)
摘要:把询问记下来,然后开个桶差分 阅读全文
posted @ 2018-10-01 19:23 Ressed 阅读(293) 评论(0) 推荐(0)
摘要:反着建边,从T bfs找合法的点,然后再正着bfs一下求最短路就行了 阅读全文
posted @ 2018-09-27 07:56 Ressed 阅读(193) 评论(0) 推荐(0)
摘要:有两种情况:一个点到它的父亲的父亲(要算两次)、一个点的子节点之间互相到达 阅读全文
posted @ 2018-09-25 21:52 Ressed 阅读(156) 评论(0) 推荐(0)