当前位置: 首页 > ops >正文

20250821 圆方树总结

引子

前置芝士:树、点双、呃,还有建图。

圆方树

A1:圆方树是什么?
Q1:把一张图转换成一棵,这棵树就叫圆方树,也叫虚树

A2:我们为什么要把一张图转换成一棵树?
Q2:因为树对于一般图来说有许多友好的性质。

A3:圆方树为什么叫圆方树?
Q3:因为圆方树是由一堆圆点方点组成的树,所以叫圆方树。

A4:圆方树能干什么?
Q4:把图上的问题转化成树上问题,可以使问题更加简洁明了。

A5:圆方树具体怎么实
Q5:哦,我们先来看个样例吧!

例子

这是张图
这是原图,首先声明一下,原图内的所有原点都为圆点。第一步,我们要找到所有的点双,这张图总共有5个点双;第二步,在每个点双里面设立一个方点,注意,这是虚构的点,然后,在新图里面将这个方点与这个点双里面的所有点连接起来,这样圆方树就建好了!
在这里插入图片描述
这就是圆方树,建树本身不难,会求点双就能用把圆方树建出来,难点在于如何恰当的赋权值使得在圆方树上能求解原问题。

例题,铁人两项

题面:上洛谷自己搜

算了,压缩一下题面:给定一张无向图,问有多少互不相同三元组<a, b, c>
使得存在一条从a到b经过c的简单路径。

在同一个点双中任意选取两点,它们之间的所有简单路径的并集恰好构成该点双。具体来说,两点间简单路径经过的顶点集合等于路径上各点双的并集。

将这一性质转化到圆方树上,可以表述为:两个圆点之间的路径覆盖的顶点集合包括路径上的所有圆点,以及这些圆点相邻的方点所对应的圆点。由于c不能等于a或b,最终答案就是这个集合的大小减去2。

具体统计方法如下:假设u到v的路径为u→s₁→c₁→s₂→v。路径上的点权之和为valu + vals₁ + valc₁ + vals₂ + valv。为了准确计算方点相邻圆点的数量,我们可以将方点的权值设为其相邻圆点的数量。但为了避免圆点被多个相邻方点重复计算,需要将圆点的权值设为-1。这样处理能有效解决两方点夹一圆点时的重复计数问题,同时首尾两点的贡献无需计入。

最终,圆方树上任意两圆点间的路径距离即为它们对答案的贡献值。问题因此转化为计算树上所有圆点对之间路径权值之和。通过树形DP统计每个顶点在路径中出现的次数与其权值的乘积,即可求得最终答案。

struct edge{//直接提交有惊喜哦int to,nxt;
}d[maxn];
vector<int> vec[maxn];
long long head[maxn*2],square[maxn],stac[maxn],low[maxn],dfn[maxn],siz[maxn],n,m,ans,cnt=1,id,top,nowsize,f;
void add(int u,int v){d[++cnt]=(edge){v,head[u]},head[u]=cnt;
}
void ins(int u,int v){vec[u].push_back(v);
}
void dfs(int u,int fa){siz[u]=u<=n?1:0;for(int i=0;i<vec[u].size();i++){int v=vec[u][i];if(v==fa)continue;dfs(v,u);ans+=siz[v]*siz[u]*square[u];siz[u]+=siz[v];}ans+=siz[u]*(nowsize-siz[u])*square[u];
}
void tarjan(int u){low[u]=dfn[u]=++id;stac[++top]=u;nowsize++;for(int i=head[u];i;i=d[i].nxt){int v=d[i].to;if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);if(low[v]>=dfn[u]){square[++f]=0;while(true){ins(f,stac[top]);ins(stac[top],f);square[f]++;if(stac[top--]==v)break;}ins(f,u);ins(u,f);square[f]++;}}else{low[u]=min(low[u],dfn[v]);}}
}
int main(){cin>>n>>m;f=n;for(int i=1;i<=n;i++){square[i]=-1;}for(int i=1;i<=m;i++){int l,r;cin>>l>>r;add(l,r);add(r,l);}for(int i=1;i<=n;i++){if(dfn[i])continue;nowsize=0;tarjan(i);top--;dfs(i,0);}cout<<ans*2;
}
http://www.xdnf.cn/news/18380.html

相关文章:

  • 一、部署LNMP
  • 实现自己的AI视频监控系统-第一章-视频拉流与解码3
  • mac的m3芯使用git
  • 18维度解密·架构魔方:一览无遗的平衡艺术
  • LT8712SX,Type-C/DP1.4 /eDP转 DP1.4/HD-DVI2.0 带音频
  • AXI GPIO S——ZYNQ学习笔记10
  • Java项目:基于SpringBoot和VUE的在线拍卖系统(源码+数据库+文档)
  • K 均值聚类(K-Means)演示,通过生成笑脸和爱心两种形状的模拟数据,展示了无监督学习中聚类算法的效果。以下是详细讲解:
  • 【typenum】 19 类型相同检查(type_operators.rs片段)
  • JavaWeb前端03(Ajax概念及在前端开发时应用)
  • SD 节点学习
  • ZStack Zaku替代VMware Tanzu:六项对比、构建虚拟机+容器一体化架构
  • HTTP 403 错误:后端权限校验机制深度解析
  • Matplotlib数据可视化实战:Matplotlib高级使用技巧与性能优化
  • 用OpencvSharp编写视频录制工具
  • Matplotlib数据可视化实战:Matplotlib数据可视化入门与实践
  • 【Android】悬浮窗清理
  • Pytorch基础学习--张量(生成,索引,变形)
  • 从系统漏洞归零到候诊缩短20%:一个信创样本的效能革命
  • 机器学习聚类与集成算法全解析:从 K-Means 到随机森林的实战指南
  • CRMEB私域电商系统后台开发实战:小程序配置全流程解析
  • 贪吃蛇游戏(纯HTML)
  • 什么是区块链?从比特币到Web3的演进
  • 图像中物体计数:基于YOLOv5的目标检测与分割技术
  • 十分钟速通堆叠
  • 智慧城市SaaS平台/市政设施运行监测系统之空气质量监测系统、VOC气体监测系统、污水水质监测系统及环卫车辆定位调度系统架构内容
  • 终结开发混乱,用 Amazon Q 打造AI助手
  • 华为云ModelArts+Dify AI:双剑合璧使能AI应用敏捷开发
  • CSS【详解】性能优化
  • 【知识储备】PyTorch / TensorFlow 和张量的联系