![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【算法】树,图
树,图,网等
StarsWhisper
䮸䶵䲑䪂䌨䵄
展开
-
【差值并查集(口胡算法)】 HDU7136 CCPC2021网络选拔赛重赛1011 Jumping Monkey
题面HDU7136 不放了思路把所有的点按照权值从小到大排序, 依次用并查集维护每次更新一个点, 把此点与其相邻的枚举过的点并为一个集合, 这样每次更新可以使这个集合的点的遍历数量都+1用num[]记录一个点可以合法遍历的点的数量, 且num[]仅对代表元生效用gap[]记录一个点于其代表元的差值, 非代表元的答案为 num[] - gap[]记得路径压缩, 不路径压缩——反正我没试过, 会T吧变量&数组 解释建图存图用的 :head[], idx, u, v, edg[]输入原创 2021-10-12 13:04:34 · 133 阅读 · 0 评论 -
【换根DP】Tree and Permutation
Tree and Permutation题目大意给你一颗n个点的树, 有边权,求这个东西:Σi=1nΣj=1ndis[i to j]∗(n−1)!\Sigma_{i = 1} ^n \Sigma_{j = 1}^n dis[i~to~j] * (n - 1) !Σi=1nΣj=1ndis[i to j]∗(n−1)!换根dp用换根dp算前面一坨, 然后 * (n - 1)!先dfs(类似树形dp)求任意一个点到所有点的距离part[a]。然后可以原创 2021-10-07 21:03:24 · 95 阅读 · 0 评论 -
Splay
luogu.com.cn P3391 文艺平衡树#include <cstdio>#include <algorithm>const int N = 100005;int n, m, rt, qx, qy;struct SplayNode{ int fa, son[2], size, rev, rt;}snode[N];inline void pushup(int x){ int son0 = snode[x].son[0], son1 = snode[原创 2021-09-18 14:20:33 · 68 阅读 · 0 评论 -
【树的直径】树形DP求解
思路每次记录每个子树从根到叶的最长的链, 然后把最长前2长的拼起来先更新D再更新dp, 否则会求出一条最长链*2void dfs(int x, int efr){ for(int e = head[x]; e; e = edg[e].nxt){ if((e ^ 1) == efr) continue; int y = edg[e].to; dfs(y, e); D = std::max(D, dp[x] + dp[y] + 1);原创 2021-09-13 12:13:34 · 107 阅读 · 0 评论 -
【状压DP】斯坦纳树
前言斯坦纳树常用于解决类似这样的最小代价联通问题:https://www.luogu.com.cn/problem/P4294思路tip1:对于一个结点, 通过状态压缩的思想,用一个整数sta表示这个结点与所有目标节点的联通状态, 在sta的二进制位中,若第x位为1,表示该结点与第x个目标结点联通,反之则为不连通用dp[i][sta]表示结点i联通sta状态的最小代价状态转移part1若结点i与状态sta1和sta2都联通,且sta1与sta2无重合结点(即sta1, sta2 是对sta1+原创 2021-09-05 22:16:25 · 274 阅读 · 0 评论 -
可持久化线段树【主席树】可持久化并查集【主席树+并查集】
笼统的主席树原理众所周知, 主席树是可以持久化的, 换言之你能知道你所维护信息的所有历史状态。 主席树是这样做的:1.首先建一颗空树,代表初始状态 (下图黑色) , 也就是第0次操作后的状态。tipA:你每次只对一个节点的数据进行更新,所以相当于更改了树上的一条链。2.我们不在原来的树上修改,而是创建若干个新的节点组成一条链代表树中修改后的各个节点 (下图红色) ,然后直接把这条链糊到树上, 并且让新链中的每个节点都连好它在书中应该连的节点 (下图蓝色) 。tipB:你会发现只要交换新旧链原创 2021-09-03 11:58:50 · 125 阅读 · 0 评论 -
【树的直径 dfs dp】P4408 [NOI2003] 逃学的小孩
P4408 [NOI2003] 逃学的小孩#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <string>#include <queue>#include <vector>#include <原创 2021-04-22 20:35:44 · 78 阅读 · 0 评论 -
【LCA练习 倍增 tarjin】 洛谷P3379【模板】最近公共祖先 P1967货车运输
洛谷P3379【模板】最近公共祖先构造fa数组的正确写法是这样的for(int i=1; i<=20; i++){fa[x][i] = fa[fa[x][i-1]][i-1];}然而第一遍错写成了这样for(int i=1; i<=20; i++){fa[x][i] = fa[father][i-1];}这显然是错误的,不是方法他的父亲的上2^i-1个节点,而是访问它的上2^i-1个节点的上2^i-1个节点引以为戒#include <iostream>#i原创 2021-04-17 15:53:16 · 126 阅读 · 1 评论 -
【二分图匹配 练习】洛谷P3386【模板】二分图最大匹配P2756飞行员配对方案问题P1129矩阵游戏P1559运动员最佳匹配问题P4014分配问题P1640连续攻击游戏
洛谷 P3386【模板】二分图最大匹配#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <map>#include <stack>#include <string>#include <cstring>#include <vector>#include <cmath&原创 2021-04-16 21:51:04 · 116 阅读 · 0 评论 -
【单源最短路 spfa Dijkstra】 洛谷 P3371 【模板】单源最短路径(弱化版) ## lguou
洛谷 P3371 【模板】单源最短路径(弱化版)Dijkstra#include <cstdio>#include <iostream>#include <cstring>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <set>#include <queue>#inclu原创 2021-04-14 18:43:24 · 136 阅读 · 1 评论 -
【tarjin算法练习 缩点,割点,割边】洛谷 P3387缩点模板P3388割点模板 HDU4738 caocao‘bridge
洛谷 P3387缩点模板vis数组是必要的,如果遇到vis[i]=false的点,说明此点对应的强连通已经被缩点过了,而访问的i的起点并不属于这一强连通分量。若这时执行low[x] = std::min(low[x],dfn[y]);可能会导致一些点在栈内无法弹出。#include <cstdio>#include <iostream>#include <cstring>#include <cstdlib>#include <algorith原创 2021-04-13 22:31:40 · 149 阅读 · 0 评论 -
【线段树练习】 洛谷线段树模板1 CF1288E
洛谷 P3372 线段树模板1#include <bits/stdc++.h>const int N = 1e5+4;typedef long long LL;LL val[N<<2],lazy[N<<2];int qu[N];int n,m,x,y,k,op;int getMid(int l,int r){ return (l+r) >> 1;}void build(int l,int r,int rt){ if(l原创 2021-04-05 10:40:49 · 142 阅读 · 0 评论 -
【树状数组练习】洛谷 树状数组模板1、2 P1908 逆序对
洛谷 P3374 树状数组模板1#include <cstdio>#include <iostream>#include <cstring>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <string>//typedef long long int LL;typedef std::pa原创 2021-04-05 10:36:32 · 112 阅读 · 0 评论 -
(强行算法)对2019点美赛D题极端化的算法探讨、设计与遇到的问题(未完,但可能也到此为止)
卢浮宫 某建筑疏散问题不考虑残疾人,不考虑工作人员,不考虑一切麻烦事。只考虑一群正常人走出建筑,怎样最快。0. 铺垫定义假设某建筑有好几层,层与层之间有若干通道连接,将这些通道定义为窄道(如楼梯),出口有若干个,可以存在于任意一层,出口与外界之间也存在窄道(如门)(若人是源源不断的,则通过门和通过楼梯所需的平均时间近似相等)1.定义 单位时间选一个合适的时间长度当单位时间2.定义 单位距离单位时间内人按某个速度匀速行进的距离作为单位距离(eg:走楼梯和走平地在单位时间内走过的距离可能不同,但他原创 2021-01-12 23:46:19 · 478 阅读 · 1 评论 -
【AC自动机 / trie树】G - Word Puzzles POJ - 1204
题目描述Word puzzles are usually simple and very entertaining for all ages. They are so entertaining that Pizza-Hut company started using table covers with word puzzles printed on them, possibly with the intent to minimise their client’s perception of any pos原创 2020-07-31 17:46:56 · 306 阅读 · 0 评论 -
【无向图 - 带条件(最小换乘)最短路】L3-014 周游世界 (30分)
https://pintia.cn/problem-sets/994805046380707840/problems/994805048482054144#L3-014 周游世界 (30分)周游世界是件浪漫事,但规划旅行路线就不一定了…… 全世界有成千上万条航线、铁路线、大巴线,令人眼花缭乱。所以旅行社会选择部分运输公司组成联盟,每家公司提供一条线路,然后帮助客户规划由联盟内企业支持的旅行路线。本题就要求你帮旅行社实现一个自动规划路线的程序,使得对任何给定的起点和终点,可以找出最顺畅的路线。所谓“最顺畅原创 2020-10-10 21:22:15 · 556 阅读 · 0 评论 -
【KM算法】B - Going Home POJ - 2195
https://vjudge.net/contest/389071#problem/B题目描述On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontally, or vertically, to an adjacent point. For each little man, you need to pay a原创 2020-08-14 20:52:29 · 167 阅读 · 0 评论 -
【线段树】 L3-017 森森快递 (30分) 27分WA代码
L3-017 森森快递 (30分)森森开了一家快递公司,叫森森快递。因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号。由于道路限制,第i号城市(i=0,⋯,N−2)与第(i+1)号城市中间往返的运输货物重量在同一时刻不能超过Ci 公斤。公司开张后很快接到了Q张订单,其中j张订单描述了某些指定的货物要从Sj 号城市运输到Tj 号城市。这里我们简单地假设所有货物都有无限货源,森森会不定时地挑选其中一部分货物进行运输。原创 2020-10-12 16:07:42 · 293 阅读 · 2 评论 -
【二叉树】 给出二叉树的中序遍历 和先序遍历或后序遍历 确定二叉树
讨论的内容如题分析拿中序遍历和后序遍历的组合举例子设数组last[]储存后续遍历 in[]中序遍历,它们的长度都是n(数组从1开始计,下标范围是1-n)树根自然为last[n] ,这时我们遍历in[]数组,在in[]数组中找到last[n]的值idx,因为in[]储存的是中序遍历,显然我们以idx为界把in数组的序列分成两份[1,idx-1],[idx+1,n],分别为两颗子树上的节点。之后我们便可以在分出的两个区间之中重复上述操作,分别找目前子树的根节点,再二分区间,直到获得完整的二叉树可以使原创 2020-10-08 23:32:57 · 312 阅读 · 0 评论 -
线段树 ~乱 ------------------------阿巴阿巴阿巴
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>const int maxn=5e4+4;int n,q,tt;int mmx,mmn;int cow[maxn];struct Node{ int mx,mn,l,r; int getMid() { return (l+r) >原创 2020-10-07 14:37:36 · 171 阅读 · 0 评论