[XSY] 线图(树形DP、分类讨论)

线图

  • 如图,每个L(L(T))上的点对应T上的一条三点链
    在这里插入图片描述
  • 在连接L(L(T))上两点,当且仅当两点代表的三点链在T上有共边,且边权为 共边边权*2+非共边1边权+非共边2边权
    在这里插入图片描述
  • 在L(L(T))上从点u走到点v,等价于u代表的三点链在T上删掉自己的一条边,然后在剩下来的两个点上选一个点接一条边,转化为v代表的三点链,代价为 不动边边权*2+删边边权+接边边权
    在这里插入图片描述
  • 先考虑两个三点链在树上的最短路。此处不赘述,大体上的分类讨论如图:
    在这里插入图片描述
  • 拓展到求任意两三点链的最短路径总和,可以用树形DP实现,考虑如何做到不重不漏:
    1.首先每对不相交三点链的贡献可以拆成两部分:树上最短路径的贡献+三点链的贡献。三点链的贡献只与树上最短路径连接的是三点链的中点还是端点有关,与具体选择什么样的最短路径无关:
    在这里插入图片描述
    一条边作为树上最短路径的一部分时,贡献永远是自身边权*4
    所以我们可以对每条边分别讨论它 作为三点链的一部分的贡献 和 作为树上最短路的一部分的贡献,再把这两部分的贡献加起来。
    2.再考虑相交的三点链对。
    对于X型,我们对每条边讨论它为四边中第1小、第2小、第3小、第4小边时自身的贡献,再把这些贡献加起来。
    对于Y型,边(u,v)(u=fa[v],u的度数为d)作为Y型的共边出现的情况有(d−1)(d−2)/2(d-1)(d-2)/2(d1)(d2)/2种,作为非共边出现的情况有(d−1)(d−2)(d-1)(d-2)(d1)(d2)种,我们在扫到这条边时直接给答案加上(d−1)(d−2)/2×4×边权(d-1)(d-2)/2\times4\times边权(d1)(d2)/2×4×即可。
    对于Z型,我们在共边处统计出整个Z型的贡献。

ps:为保证不重不漏地考虑到所有的三点链,我们在DP到树节点u时,就只考虑以u为中点的三点链

#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int N=5e5+5;
const int mod=998244353;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int add(int a,int b){return (a+b)%mod;} 
int dec(int a,int b){return ((a-b)%mod+mod)%mod;}
void Add(int &a,int b){a=add(a,b);}
struct Edge{int v,w,nxt;
}e[N<<1];
int n,d[N],head[N],cnt=0,ans;
int f[N],g[N];
//f[i]:i子树内三点链的个数
//g[i]:i子树外三点链的个数
int addedge(int u,int v,int w){e[++cnt].v=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
}
void dfs(int u,int ff){f[u]=1ll*d[u]*(d[u]-1)/2%mod;for(int i=head[u];i;i=e[i].nxt){if(e[i].v!=ff){dfs(e[i].v,u);Add(f[u],f[e[i].v]);}}
}
int to[N],val[N],Sw[N];
int su[N],sv[N];
int pre[N],suf[N];
bool cmp(int a,int b){return val[a]<val[b];
}
void work(int u,int ff){for(int i=head[u];i;i=e[i].nxt){int v=e[i].v;if(v==ff) continue;work(v,u);}int tot=0;for(int i=head[u];i;i=e[i].nxt){int v=e[i].v;to[++tot]=v;val[v]=e[i].w; Add(Sw[u],e[i].w);su[v]=v==ff?f[u]:g[v];sv[v]=v==ff?g[u]:f[v];}sort(to+1,to+tot+1,cmp);pre[0]=suf[tot+1]=0; for(int i=1;i<=tot;i++) pre[i]=add(pre[i-1],sv[to[i]]);for(int i=tot;i;i--) suf[i]=add(suf[i+1],sv[to[i]]);for(int i=1;i<=tot;i++){int v=to[i],du=d[u],dv=d[v],w=val[v];//处理这条边为相交的三点链做的贡献 Add(ans,1ll*(tot-i)*(tot-i-1)*(tot-i-2)/6*9%mod*w%mod);//以u为中心的X型,当前边为第1小边 Add(ans,1ll*(i-1)*(tot-i)*(tot-i-1)/2*7%mod*w%mod);//以u为中心的X型,当前边为第2小边 Add(ans,1ll*(i-1)*(i-2)/2*(tot-i)*5%mod*w%mod);//以u为中心的X型,当前边为第3小边 Add(ans,1ll*(i-1)*(i-2)*(i-3)/6*3%mod*w%mod);//以u为中心的X型,当前边为第4小边 Add(ans,1ll*(tot-1)*(tot-2)/2*4%mod*w%mod);//以u为中心的Y型if(v!=ff) Add(ans,1ll*(du-1)*(dv-1)*2%mod*w%mod+add(1ll*(Sw[u]-w)*(dv-1)%mod,1ll*(Sw[v]-w)*(du-1)%mod));//以u为中心的Z型 //处理这条边为不相交的三点链做的贡献 if(v!=ff) Add(ans,1ll*(sv[v]-(dv-1))*(su[v]-(du-1))*4%mod*w%mod);//这条边在树上最短路径中,注意if Add(ans,1ll*dec(su[v],1ll*du*(du-1)/2%mod)*(tot-2)%mod*w%mod); Add(ans,1ll*dec(su[v],pre[i-1]+1ll*du*(du-1)/2%mod)*(tot-i-1)%mod*2*w%mod);Add(ans,1ll*dec(su[v],suf[i+1]+1ll*du*(du-1)/2%mod)*(tot-i)%mod*2*w%mod);//树上最短路径连中点uAdd(ans,(1ll*(tot-1)*3*w%mod+1ll*(Sw[u]-w))*(sv[v]-(dv-1))%mod);//树上最短路径连端点v }
}
signed main(){n=read();for(int i=1;i<n;i++){int u=read(),v=read(),w=read();addedge(u,v,w);addedge(v,u,w);d[u]++;d[v]++;}dfs(1,0);for(int i=1;i<=n;i++) g[i]=f[1]-f[i];work(1,0);cout<<dec(ans,0)<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bzoj3309-DZY Loves Math【莫比乌斯反演,线性筛】

正题 bzoj没了&#xff0c;在darkbzoj交吧 题目链接:https://darkbzoj.tk/problem/3309 题目大意 定义f(x)f(x)f(x)表示xxx所有质因数中最大的指数幂。 求∑i1n∑j1mf(gcd(i,j))\sum_{i1}^n\sum_{j1}^mf(\ gcd(i,j)\ )i1∑n​j1∑m​f( gcd(i,j) ) 解题思路 很显然要用莫反…

牛客网【每日一题】4月29日题目精讲 Symmetric Matrix

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld题目描述 输入描述: The input consists of several test cases and is terminated by end-of-file. Each test c…

邻接矩阵和邻接表的使用

邻接矩阵和邻接表的使用 邻接矩阵 为了遍历一个图&#xff0c;我们使用了邻接矩阵&#xff0c;及用ai,ja_{i,j}ai,j​表示由a到b的边权 注&#xff1a;若这两个点不相连或ijijij&#xff0c;那么这个值就会设定为一个非正常的值&#xff0c;以便遍历时特判不走这条边 使用&am…

YbtOJ#20239-[冲刺NOIP2020模拟赛Day10]连边方案【状压dp】

正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/3 题目大意 求有多少个nnn个点mmm条边的无向图满足 有连边的点之间编号差不超过kkk所有点的度数都为偶数 解题思路 因为kkk很小&#xff0c;所以我们考虑状压一个点前kkk个点的奇偶状态。设fi,j,s,0/1f_{i,j,s,…

有上下界网络流问题汇总

无源汇有上下界可行流 法一&#xff08;据说适合点少边多的图&#xff09;&#xff1a; 建图方法 首先建立附加源点ss和附加汇点tt对于原图中的边x->y&#xff0c;若限制为[b,c]&#xff0c;那么连边x->y&#xff0c;流量为c-b对于原图中的某一个点i&#xff0c;记d(i…

一个迄今为止最快的并发键值存储库FASTER诞生

FASTER在过去十年中&#xff0c;云中的数据密集型应用程序和服务有了巨大的增长。数据在各种边设施&#xff08;例如&#xff0c;设备&#xff0c;浏览器和服务器&#xff09;上创建&#xff0c;并由云应用程序处理用来获得数据价值或做出决策。应用程序和服务可以处理收集的数…

【斜率优化】仓库建设(luogu 2120)

仓库建设 luogu 2120 题目大意 有一个斜坡&#xff0c;上面有n个工厂&#xff08;山顶是1&#xff0c;山脚是nnn&#xff0c;工厂都是漏填&#xff09;&#xff0c;上面有pip_ipi​个货物&#xff0c;和工厂1的距离为x1x_1x1​ 现在有一场大雨&#xff0c;你可以在某些工厂处…

牛客网【每日一题】4月30日题目精讲 换个角度思考

链接&#xff1a; 文章目录题目描述题解&#xff1a;主席树做法&#xff1a;代码&#xff1a;树状数组&#xff1a;更扯淡的方法&#xff01;&#xff01;&#xff01;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言…

三元环计数四元环计数

三元环计数 问题 给出一张n个点m条边的无向图&#xff0c;问图中有多少个三元组{ u , v , w } &#xff0c;满足图中存在 { (u,v) , (v,w) , (w,u) } 三条边。 求解 Step1 定向 将所有点按 度数 从小到大排序&#xff0c;如果度数相同按 点编号 从小到大排序&#xff0c;u…

YbtOJ#20240-[冲刺NOIP2020模拟赛Day10]弱者对决【笛卡尔树,区间dp】

正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/4 题目大意 mmm个三元组(ai,bi,ci)(a_i,b_i,c_i)(ai​,bi​,ci​)&#xff0c;如果ci≥min{xj}(ai≤j≤bi)c_i\geq min\{x_j\}(a_i\leq j\leq b_i)ci​≥min{xj​}(ai​≤j≤bi​)那么可以获得min{xj}min\{x_j\}mi…

牛客网【每日一题】5月1日题目 [SCOI2012]滑雪与时间胶囊

链接&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 a180285非常喜欢滑雪。他来到一座雪山&#xff0c;这里分布着M条供滑行的轨道和N个轨道之间的交点&#x…

漫谈单体架构与微服务架构(上):单体架构

最近微服务架构特别火爆&#xff0c;就跟人工智能、区块链一样&#xff0c;软件架构设计如果不提微服务&#xff0c;感觉就像是与世界先进的架构风格和开发技术脱了节似的&#xff0c;各方各面都无法彰显高大上的气质。本来再打算使用一套系列文章来讨论微服务的方方面面&#…

【数学】奶牛编号(jzoj 2932)

奶牛编号 jozj 2932 题目大意 求出有m个1的01串中字典序第n大的字典序 输入样例 7 3输出样例 10110数据范围 1⩽M⩽101 \leqslant M \leqslant 101⩽M⩽10 1⩽N⩽1071 \leqslant N \leqslant 10^71⩽N⩽107 解题思路 我们先从01串长度入手&#xff1a; 先对m1m 1m1的特…

CF732F Tourist Reform(dfs树、边双连通图、tarjan)

因为知道了算法tag&#xff0c;所以想到了正解&#xff1a; 先给出两个性质&#xff1a; 边双给边定向一定可以转为强连通图,此为最优解树给边定向后R的最小值必为0 性质2证明如下&#xff1a; 设树有n个节点, 若R_min!0, 则每点出度至少为1,各点出度之和至少为n, 则至少有…

【归并排序】奶牛的图片(jzoj 1812)

奶牛的图片 jzoj 1812 题目大意 给你一个序列&#xff0c;你可以交换相邻的两个数 让你用最少的交换次数来使得这个序列变成形如a1,a2...n,1,2...a−1,aa1,a2...n,1,2...a-1,aa1,a2...n,1,2...a−1,a的序列 问你最少的交换次数是多少次 输入样例 5 3 5 4 2 1输出样例 2解…

YbtOJ#20237-[冲刺NOIP2020模拟赛Day10]区间均值【树状数组】

正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/1 题目大意 nnn个数字的序列&#xff0c;求有多少个区间[l,r][l,r][l,r]的平均值在[L,R][L,R][L,R]的范围内。 解题思路 如果让每个ai−xa_i-xai​−x&#xff0c;那么统计区间和大于等于111的区间数量就可以统计…

ASP.NET Core应用程序的参数配置及使用

应用程序的开发不仅仅是写代码这点事情。假设你正在开发一个能够支持多次部署的微服务&#xff0c;此时你就需要有一个合理的应用程序配置方案&#xff0c;以便在开发和生产环境中能够方便地选用不同的配置参数&#xff0c;并且能够在部署到容器服务&#xff08;比如ACS或者Kub…

“Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛决赛(重现赛)

比赛链接 文章目录A题 A Simple Problem about election题目描述题解&#xff1a;代码&#xff1a;D题 Deploy the medical team题意&#xff1a;题解&#xff1a;代码&#xff1a;F题 Figure out the sequence题意&#xff1a;题解&#xff1a;代码A题 A Simple Problem about…

Kruskal重构树

建树 模仿kruskal的过程&#xff0c;先将边权排序 依次遍历每条边 若该边连接的两个节点u和v不在一个并查集内 就新建一个结点node 该点点权为这条边的边权 找到u&#xff0c;v所在并查集的根 fufufu,fvfvfv 连边(node,fu)(n o d e , fu )(node,fu) (node,fv)( n o d e , f…

【斜率优化】玩具装箱(luogu 3195)

玩具装箱 luogu 3195 题目大意 有n件物品&#xff0c;每件物品有相对的长度CiC_iCi​现在要把这n件物品放到容器中&#xff0c;切放的物品必须是连续的&#xff0c;若把第i件物品到第j件物品放到一个容器中&#xff0c;那此容器的长度定义为xj−i∑kijCixj−i\sum_{ki}^{j} …