![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论---树
小松萘
厉害的人可真多啊
展开
-
算法复习 - AcWing最小生成树
346. 走廊泼水节//考虑Kru//假设我们在生成最小树的过程中,计算使生成的连通块成为完全图的最小边长//枚举到某一条边的时候,假设他连接AB两个连通块//生成新的大连通块需要AB所有点连接//而且新加的边必须大于当前枚举的这条边//否则生成的树就不是以前的样子了vector<pair<int,pair<int,int>>>mp;int f[MX],siz[MX];int find(int x){ if(x==f[x]) return x;原创 2020-09-19 20:57:26 · 150 阅读 · 0 评论 -
Codeforces Round #670 (Div. 2) C - Link Cut Centroids (重心性质)
树的重心最多有两个,且相邻(妙啊)//如果有两个重心,砍掉一个重心的子树,加到另一个重心//否则随便输出一个边int n;vector<int>mp[MX];int mx[MX];//某点去掉后的最大子树int son[MX];//某点为根的子树大小void dfs(int x,int fx){ son[x] = 1,mx[x] = 1; for(auto v:mp[x]) { if(v==fx) continue; dfs原创 2020-09-14 16:45:45 · 137 阅读 · 0 评论 -
Codeforces1405 D. Tree Tag(博弈,树直径,树变链)
题意两个人开始在一个树上,初始位置为a,b,每个人最多走da,db远。问你A能不能追上B题解不管当前是A走,还是B走,他们走到哪,都只会在树上的一条链上移动,所以我们可以只考虑一条链上的情况,A赢有以下几种情况:(1)AB一开始得距离小于da,A直接一步追上B(2)da>=直径的一半,那么只要A站到树的直径中心,可以去树的任意一个地方(3)B被A堵在边边角角的情况当da*2+1>db 时,A胜vector<int>mp[MX];int maxx,dp1[MX],原创 2020-09-12 01:01:36 · 182 阅读 · 0 评论 -
Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree(DFS,贪心)
???? ???? ????题意:给一个树,一些质因子p,因子乘积为k,要求给每个边一个权值,最后两两点之间的路径和最大,且边权为1的最少,且边权乘积为k,输出最大的两两之间路径和。关键在于计算每条边经过了几次,把经过次数最多的安排大的因子。设size为以该点为根的子树大小//对于不是根节点的点,他到父亲节点的那一条边贡献次数//size[x]*(size[fa] - size[x])所以做一个DFS算size数组即可,还有就是如果边数大于因子树,补1,如果边数小于因子数,把最大的因子合并原创 2020-08-28 15:32:35 · 98 阅读 · 0 评论 -
CodeForces - 1081D Maximum Distance (最小生成树)
???? ???? ????题意有些晦涩难懂。。。(1)给出一张图,存在自环和重边,但是最终有贡献的边是两点之间的最短路(就是一张图的最小生成树)(2)对于每个特殊点,求他到其他特殊点的路径上最长的一条边对答案可能有贡献的边一定两边都有特殊点(从树上来看),这样我们找到所有这样的边,然后找到其中最大的就是答案,因为对于每个特殊点,我们总是可以取到改边另一侧的特殊点从而达到这个答案int f[MX];in...原创 2020-04-12 20:14:51 · 251 阅读 · 0 评论 -
AcWing 348. 沙漠之王 (最优比率生成树)
(1)01分数规划问题(2)因为要求比率最大所以求最小生成树,由于是完全图,所以使用primint n;//村庄数目int x[1111],y[1111],h[1111];double a[1111][1111],b[1111][1111];//长度:距离 / 成本:高度差(保证不为0)最大int vis[1111];double dis[1111];//到生成树的距离int ...原创 2020-04-06 17:12:46 · 212 阅读 · 0 评论 -
AcWing 349. 黑暗城堡 (最小路径树)
???? ???? ????给你一个图,问你有几种最短路径树(最短路径树:满足每个点到根节点的距离等于原图中的最短路的生成树)最短路径树的构造:(1)跑一次DIJ(2)假如对于边(u,v,w)dis[u]=dis[v]+w则当前路可以加入最短路径树中因为我们要保证到每个点的距离最小,所以我们其实只能用相同的权值替换当前最短路径树上的边,然后运用乘法原理相乘即可而且这种关系是单向的dis[u]=dis[v]+...原创 2020-04-06 15:11:28 · 194 阅读 · 0 评论 -
AcWing 347. 野餐规划 (控制度数的最小生成树,DFS)
(1)以Park作为1结点,题意即求1结点的度数不超过s的最小生成树(因为题目中说明每个人都可以开车,只要最后到park的车不超过 s即可)(2)这样我们先做出除1结点之外的最小生成树森林,现在要考虑的就是用1结点把这些连通块连起来(如果s小于连通块数说明不可行,不过题目保证合法)(3)贪心的想肯定是将每个连通块视为结点,加上1结点再做一个最小生成树,现在我们得到了一个答案的图(4)这时候如...原创 2020-04-06 13:53:57 · 241 阅读 · 0 评论 -
CodeForces - 1087D Minimum Diameter Tree (结论题,树的直径,构造)
???? ???? ????贪心的分配,一定是平均地把s分配到每个连接叶子结点的边。int du[MX];signed main(){ int n,s;cin>>n>>s; rpp(i,n-1) { int x,y;cin>>x>>y; ++du[x],++du[y]; } int num...原创 2020-03-30 21:14:54 · 177 阅读 · 0 评论 -
AcWing 352. 闇の連鎖 (树上差分---维护边权,LCA)
???? ???? ????(1)假设边权为删除该边之后还需要删除的边数,那么每在(x,y)上添加一条边,相当于将x到y 的路径上的边权全都加一。(2)树上差分:以点值代表该点上面那条边的权值,那么要修改x,y路径上的所有边的权值,cha[x]+=w,cha[y]+=w,cha[ lca(x,y) ] -=w*2,之后dfs一遍求子树和即可// lcaint dep[MX],dis[MX],f[MX][2...原创 2020-03-28 19:22:13 · 180 阅读 · 0 评论 -
AcWing 350. 巡逻(树的直径-----BFS与DP版本)
???? ???? ????让你在一颗树上加1/2条边,从1点开始走,新形成的图每个边经过至少一次需要走几步(1)如果不能加边,考虑dfs这颗树,很明显是2*(n-1)(每个边都需要走两遍)(2)如果可以加一条边,加了改边之后形成环,改环上的边只需要走一次即可,贪心的想我们肯定加在直径上(3)如果可以加两条边,这时候如果加了改边形成的环和上一个环有重叠,为了经过新加的这条边,我们需要把两环重叠的部分再...原创 2020-03-28 17:30:42 · 145 阅读 · 0 评论 -
POJ - 1985 Cow Marathon (树的直径-----DP版)
???? ???? ????看这个搞懂的int n,m;ll ans;ll dp[MX];//iint head[MX],tot;struct IN{int v,w,nxt;}edge[MX<<1];void add(int u,int v,int w){ edge[tot].v=v;edge[tot].w=w,edge[tot].nxt=head[u]; head[...原创 2020-03-28 14:25:35 · 150 阅读 · 0 评论 -
HDU - 2196 Computer (树形DP,树的直径相关)
???? ???? ????题意:求与每个点距离最远的点的距离选择一个根,求出他向下和向上分别的最大值,两者再求一个最大值即可。这里的DP也可以用在求直径上(树中存在负权的时候dfs/bfs不再适用), 把最后一步换成dp0与dp2求和即可int n;int id[MX];//i结点的最深链在哪个儿子ll dp[MX][3];int head[MX],tot;struct IN{int v,w,...原创 2020-03-28 13:17:09 · 175 阅读 · 0 评论 -
AcWing 350. 巡逻(Kru)
假设我们现在已经得到了这个完全图的所有边,考虑kru最小生成树的过程,排序每次选出一个边,如果在两个连通块中,则改边属于最小生成树,并连接两个连通块。即当前的两个连通块只能由改应该是连接当前两个连通块中的最短边,这样我摸构造完全图的时候,x和y所在的连通块生成完全图需要(szx*szy-1)条边,每条边的值最低为w+1(因为排序之后要保证他们都在w 之后),同时计算过程中也要保证边权由低到高合并...原创 2020-03-27 22:18:33 · 220 阅读 · 0 评论 -
CodeForces - 1099D Sum in the tree (树上贪心)
???? ???? ????(1)贪心想肯定让偶数层的权值a置为0,这样我们可以计算出偶数层的s值为他的父亲结点s值(2)为了方便计算,进一步想,让偶数层代替他的最小的儿子结点的贡献,即让si等于儿子结点中最小的si(为了保证合法),这样做相当于对该儿子结点ai值置零,父亲结点代替该ai(3)由(2) ,我们将所有s值上调之后直接做差计算每个结点的贡献即可int s[MX],f[MX];inline i...原创 2020-03-18 20:53:55 · 168 阅读 · 0 评论 -
CodeForces - 1101D GCD Counting (树的直径,分解质因子,剪枝)
???? ???? ????题意:每个点有一个值ai,g ( x , y ) 定义为两点最短路径的总gcd,问你满足 g ( x , y ) > 1 的两点的最大距离(1)筛出2e5的所有素数因子(2)将点放入他所有质因子的集合中(3)枚举每个质因子的点集,利用求树的直径的方法求出该点所在的链的长度(4)最最最重要的剪枝,如果是两次深搜中的第一次且发现当前点已经搜索过了,returnbool ...原创 2020-03-16 22:04:49 · 121 阅读 · 0 评论 -
CodeForces - 1305D Kuroni and the Celebration (树结构)
????♀️ ????♀️ ????♀️题意:给你一个树结构,每次可以询问两个结点的LCA,问你树的根。每次找出两个度为1的结点查询,(1)如果LCA等于某点,则由于两点度数为1,不是叶子结点就是根节点,由于一个叶子结点不可能为另一个叶子的祖先,则一个点为根结点,一个点为叶子(2)否则这两个结点一定为两个叶子结点,将他们直接删除还有就是删除的时候set的应用//从叶子结点开始删除,直到最后剩下根结...原创 2020-03-05 08:39:46 · 110 阅读 · 0 评论 -
CodeForces - 1118F1 Tree Cutting (Easy Version)(DFS)
????♀️ ????♀️ ????♀️//目的:找到一个这样的结点,他的子树包含所有的蓝色/红色,且不包含另一种颜色//所以记录下每个节点的子树的蓝色,红蓝结点分别有多少//然后枚举每条边检验int n,ans;int a,b;//一共有多少蓝/红色int tag[MAXN];//某点的颜色int col[3][MAXN];//某点的子树的颜色个数int dep[MAXN];//深度vec...原创 2020-02-29 17:05:05 · 86 阅读 · 0 评论 -
CodeForces - 1133F2 Spanning Tree with One Fixed Degree (并茶几,生成树)
???? ???? ????题意:是否能从给出的图中得出一个生成树,使树中1的度数为k(1) 若原图中1的度数小于k ,显然不行(2)若原图中1的度数大于k,我们需要删除一部分与1相连的边,先把与1相连的所有边删除,剩下我们要添加的1边就需要将这些连通块连接起来,如果连通块个数大于k显然也不行(3)将所有连接起连通块的1边加入答案,之后再随便选几个边直到满足1的度数为k为止,再次根据已经添加到答案的边做一次...原创 2020-02-23 15:50:34 · 346 阅读 · 0 评论