【POJ3417】Network【LCA】【差分】

【题解】poj3417 Network 树上差分+lca 题目链接 Description Yixght is a manager of the company called SzqNetwork(SN). Now she’s very worried because she has just received a bad news which denotes that DxtNetwork(DN), the SN’s business rival, i... 阅读详情

题目大意:

题目链接:http://poj.org/problem?id=3417
一个 n n n个结点的树加入了 m m m条边。求删除一条原边和一条新边把这个图拆成两个部分的方案数。


思路:

对于后面的 m m m条新边,我们可以把每一条原边加入一个边权(初始为 0 0 0),对于每次加入的新边 ( x , y ) (x,y) (x,y),我们就将树上从 x x x到 y y y的路径的边权加 1 1 1。最终求答案时枚举所有的边:

  • 如果边权为 0 0 0,那么删除这条边之后树就被分成了两个不相邻的部分。那么此时删除任意一条边都满足分成两个部分。 a n s + = m ans+=m ans+=m
  • 如果边权为 1 1 1,那么删除包含这条边的新边(有且仅有一条)就可以满足分成两个部分。 a n s + + ans++ ans++
  • 如果边权大于 1 1 1,无论如何都不可以满足要求。

那么我们就得到了一个 O ( n m ) O(nm) O(nm)的算法。


关于优化

记得差分吗?
我们每次将新边 ( x , y ) (x,y) (x,y)之间的每一条边的权值加 1 1 1,其实是可以利用树上差分的方法来 O ( 1 ) O(1) O(1)搞出来的。
对于新边 ( x , y ) (x,y) (x,y),我们将 s [ x ] + + , s [ y ] + + , s [ l c a ( x , y ) ] − = 2 s[x]++,s[y]++,s[lca(x,y)]-=2 s[x]++,s[y]++,s[lca(x,y)]−=2。然后跑一遍 D F S DFS DFS,求出每一点 s [ x ] s[x] s[x]表示它与父节点之间的边被覆盖的次数。
时间复杂度 O ( n + m ) O(n+m) O(n+m)


代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; 
typedef long long ll;

const int N=100010;
const int LG=20;
int n,m,x,y,tot,head[N],s[N],f[N][LG+1],dep[N];
ll ans;

struct edge
{
	int next,to;
}e[N*2];

void add(int from,int to)
{
	e[++tot].to=to;
	e[tot].next=head[from];
	head[from]=tot;
}

void dfs1(int x,int fa)
{
	dep[x]=dep[fa]+1;
	f[x][1]=fa;
	for (int i=2;i<=LG;i++)
		f[x][i]=f[f[x][i-1]][i-1];
	for (int i=head[x];~i;i=e[i].next)
	{
		int y=e[i].to;
		if (fa==y) continue;
		dfs1(y,x);
	}
}

int lca(int x,int y)
{
	if (dep[x]<dep[y]) swap(x,y);
	for (int i=LG;i>=1;i--)
		if (dep[f[x][i]]>=dep[y]) x=f[x][i];
	if (x==y) return x;
	for (int i=LG;i>=1;i--)
		if (f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][1];
}

int dfs2(int x,int fa)
{
	for (int i=head[x];~i;i=e[i].next)
	{
		int y=e[i].to;
		if (fa==y) continue;
		s[x]+=dfs2(y,x);
	}
	if (x!=1)
	{
		if (s[x]==0) ans+=(ll)m;
		if (s[x]==1) ans++;
	}
	return s[x];
}

int main()
{
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for (int i=1;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	dfs1(1,0);
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		s[x]++;
		s[y]++;
		s[lca(x,y)]-=2;
	}
	dfs2(1,0);
	printf("%lld\n",ans);
	return 0;
}
POJ - 3417 Network 【树上差分 + LCA + 思维】 https://vjudge.net/problem/POJ-3417   题意: 先给一棵具有n个节点的树, 然后再给出m条边, 问从树上删去一条边, 再从m条边中删去一条边, 把这个图分成至少两部分的方案数.  思路: 很容易就可以想到,每加入一条边,都会形成环。这条环是什么样的呢? 肯定是, u -&gt; lca(u,v) -&gt; v  - &gt; u  肯定是这样一个环,... 阅读详情

相关推荐

cuda安装时出现错误 Unable to locate package cuda-toolkit-12-4

cuda安装时出现错误 Unable to locate package cuda-toolkit-12-4

4870

LCA 树上差分

对点加,两两点间求LCA,差分。

m0_51731088的博客 506

TwinCAT3 Modbus-TCP Client/Server使用

/起始地址是12289//起始地址是12294。

panjinliang066333的博客 7736

LCA--树上差分

引入 在一棵树中,如果有Q次操作:从X走到Y,最后询问每个点走的次数。 ∵有Q次操作,但只询问一次,

灰色的人的博客 815

实测对比:DECIMER、Img2Mol、MolScribe,哪个化学结构识别工具更靠谱?

化学结构识别(CSR)工具的核心任务是将分子结构图像转换为SMILES(Simplified Molecular Input Line Entry System)表示。这一过程需要克服图像质量差异、绘制风格变化以及特殊基团识别等挑战。三款工具采用不同的技术路线:DECIMER:基于EfficientNetV2+Transformer架构,优势在于处理标准期刊文献中的分子图示Img2Mol。

weixin_32576389的博客 346

汇川Easy 301 和MCGS进行Modbus RTU通讯(485)浮点数读取和写入

4DF0001对应寄存器D0,4DF0003对应寄存器D2。注意:要选com2口,com1口是232通讯。

qq_61916672的博客 2909

HDU5044【LCA+差分】

思路: 树以1为根节点,然后向下DFS 两个差分 ADD1 操作,对节点 (u, v) 就是 他们的两个各自节点+w, 然后节点LCA(u, v) - w,LCA(u, v)的父节点-w,然后DFS一遍就能求出来 ADD2 操作就更简单了,边的权值都放在节点上,然后直接在LCA(u, v)上 - 2*w,另外u, v都+w. 但是很卡常数。//#pragma comment(li

ONE MORE TRY 518

Cilium动手实验室: 精通之旅---1.Getting Started with Cilium

我们需要在 HTTP 层的第 7 层实施策略,以限制允许 tiefighter 调用的确切 API,以及不允许调用哪些 API。上仅需要的 API 资源的访问,从而为微服务之间的通信实施“最低权限”安全方法。船只上进行匹配,因此我们需要在该标签上进行匹配,此外,我们必须确保来自带有标签。为了模拟我们的连接测试,我们将使用 curl 执行简单的 API 调用。在我们立即开始更改策略之前,让我们考虑一下相应的网络策略应该是什么样子。的规则,该规则将通过 L3-L4 策略对死星的访问限制为仅帝国船只。

Q先生 1126

NOIP2016天天爱跑步——LCA+树上差分

Description 小c同学认为跑步非常有趣,于是决定制作一款叫做《天天爱跑步》的游戏。?天天爱跑步?是一个养成类游戏,需要玩家每天按时上线,完成打卡任务。这个游戏的地图可以看作一一棵包含 N个结点和N-1 条边的树, 每条边连接两个结点,且任意两个结点存在一条路径互相可达。树上结点编号为从1到N的连续正整数。现在有个玩家,第个玩家的起点为Si ,终点为Ti 。每天打卡任务开始时,所有玩家...

stevensonson的博客 438

使用Visual Studio 2022创建CUDA编程项目

本文介绍了在Visual Studio 2022中配置CUDA开发环境的完整流程。首先需要安装VS2022并勾选C++开发组件,然后安装CUDA Toolkit和兼容的NVIDIA驱动。创建项目时选择CUDA模板,VS会自动生成数组相加的示例代码。项目配置包含CUDA头文件依赖和链接器设置(cudart_static.lib)。文章详细说明了从环境搭建到代码编写、调试的完整步骤,帮助开发者快速上手CUDA编程。

新兴IT民工的专栏 1万+

EML 全面实践指南:把 SAP RAP 业务对象玩出工程化的稳定与优雅

本文面向掌握ABAP基础、正在实施RAP的开发者,深入讲解EML(Entity Manipulation Language)的核心用法。文章围绕READ ENTITIES、MODIFY ENTITIES、COMMIT ENTITIES三大语句,详细解析其语义、类型体系、事务机制及工程实践。重点内容包括:字段裁剪、派生类型、草稿控制、批量更新、事务缓冲与保存序列等关键技术点,并配合真实案例代码。旨在帮助开发者在SAP ABAP On-Premise和BTP环境中构建可维护、可演进的业务对象访问层,同时避免常见

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 329

【POJ3417】Network-LCA算法+树上差分

【POJ3417】Network-LCA算法+树上差分

Maxwei_wzj的OI世界 1241

手把手教你学Simulink——基于多能互补微电网系统的建模与优化场景实例:风柴储联合供电系统在孤岛模式下的功率分配建模

本文介绍了使用MATLAB/Simulink和Simscape Electrical构建风柴储联合供电系统的建模方法。系统包含风力发电、柴油发电、储能电池等模块,重点研究孤岛模式下功率分配策略。详细说明了从创建项目、添加模块到搭建风力发电系统(含MPPT控制)、柴油发电系统及集成各模块的全过程,并提供了仿真参数设置建议。通过分析频率偏差、电池SOC等关键指标,验证了系统在维持稳定运行的同时能有效利用可再生能源。该模型为研究多能互补微电网提供了实验平台,未来可拓展更高效的能量管理策略和AI技术的应用。

MHD0815的博客 1万+

poj3417 Network——LCA+树上差分

题目:http://poj.org/problem?id=3417 根据一条边被几个环覆盖来判断能不能删、有几种情况等; 用树上差分,终点 s++,LCA s-=2,统计时计算子树s值的和即可; 用ST表做LCA,不知为何WA了: #include<iostream> #include<cstdio> #include<cstring&g...

aodan5477的博客 173

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

POJ-3417 Network LCA+树上差分

题目:https://vjudge.net/problem/POJ-3417#author=0 题目大意:在一棵n个点的树上由n-1条强边连接,现在新添m条弱边,需要切掉一条强边以及一条弱边,使得树变为完全无联系的两部分,问一共有多少种不同的切法 对于每一条新加入的弱边,都会跟原来的强边形成环 (绿色为弱边,黑色为强边) 假如需要切除一条强边,需要知道这条强边一共在几个环中,因为一个环...

forOnward的博客 225

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

POJ3417 Network【LCA+树上差分】

传送门 Description Yixght is a manager of the company called SzqNetwork(SN). Now she's very worried because she has just received a bad news which denotes that DxtNetwork(DN), the SN's business rival, ...

qq_42211531的博客 320

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

POJ3417 Network - 树上差分 - lca

题意:给出一个无向图,分别给出n-1条树边(主要边)和m条非树边(附加边),这个无向图可以看做一棵树外加m条附加边,每次切割时,你可以切断一条主要边和一条附加边,求切割后,能够使这个无向图不再连通的切割方案数(即使只切断一条主要边就可以使图不连通,你也需要再切断一条附加边) 我们先考虑只有一条附加边(x,y)时,这时这张图就是一棵基环树 我们发现如果x,y之间有一条附加边,则这条边和x到y...

Zolrk的博客 1191

POJ3417 Network (闇の連鎖) 树上差分 lca

POJ3417 Network (闇の連鎖) ### 树上差分 lca POJ3417 闇の連鎖 奇奇妙妙的树上差分 主要边是树的结构 附加边让树的结构出现环 手画可以发现 设\(xy\)为附加边,假如第一次切断了\(xy\)通过树边相连的路径 也就是破坏了环 那么第二次就必定要切断\(xy\) 那么就可以通过边差分来解决这个问题 假如\(x\)和\(y\)之间有附加边 在这两个点上记\...

dazhishu2366的博客 159

POJ - 3417 Network LCA+树上差分

思路:首先来说,给一个树加一条边肯定要构成一个环,我们假设加了该边后产生的环上的每一条边都累计加一。 假设这条边是a到b,那么其实就是原树a->lca(a,b)到b->lca(a,b)上的边累计加一。 这个有什么用呢? 第一:当原树上某一条边的累加值为0时,也就是这一条边与所有的假边都没有构成环,那么你只要把这一条边删除了,再任意删除一条假边,肯定把图分成两份。答案+M 第二:...

swust5120171204的博客 175

POJ - 3417 Network (LCA+树上差分)

题目传送门:POJ - 3417 Network 题目大意: 存在一棵n个结点的树,加入m条新边,现在要让这个图不连通,你可以切断两条边,要求切断一条原边,一条新边,求切割的方案数。 分析: 加入m条新边,假设加入新边(u,v),那么u-->lca(u,v)-->v-->u形成一个环,此时可以切断新边,和环上任意的一条原边就可以使图不连通。 可以发现若加入一条...

aochan2391的博客 126

POJ 3417 Network【树上差分 | LCA】

题目链接 题目描述: 你是一名黑客,你要摧毁竞争对手的网络,竞争对手的网络由N个点、N - 1条通道组成,并且每个点互相是联通的,但是竞争对手为了加固网络,增加了M条新通道,你的任务就是通过摧毁一条原来的通道和摧毁一条新通道来把竞争对手的网络分成两部分,问有多少种方法。 题解: 由描述我们可知,网络原本是一棵树,我们如果在树上(x, y)之间增加一条了新通道,那么新通道和原本网络上的通道就会形成一个环,那么如果我们切断树上 x->y 路径上的某条通道,那么我们下一步就必须切断新通道(x, y)才能把

weixin_44258590的博客 209

LCA/树上差分 (POJ - 3417 Network)

学习蓝皮书看到的一个题 题目链接 我们不妨把每个附加边当作是实边的一次“覆盖”。 每个附加边将会覆盖掉从从附加边两个端点开始至两端点的最近公共祖先(LCA)所经过的所有边,如图: “覆盖”的意义是: 如切开被覆盖的边(且该边只被覆盖一次),能且只能切开把它覆盖的那条附加边,从而将图切成两部分。 而且 如果某实边的覆盖次数为0, 则切开它后,再切开任意附加边就可以将图切成两部分。 我们设数...

平凡人Kalzn的博客 348

POJ 3417 Network (lca+树上差分)

题意:n个点的生成树,还有m条附加边,删去一条生成树的边和一条附加边,使得变成两个连通分量,有几种方案。 题解:lca+树上差分 对于每一条附加边<x, y>,将x到y的lca路径上的边标记,即对于该路径上的任意边删去,再删去附加边即可满足要求,但此做法前提是该路径上的边只被覆盖一次。这是第一种情况,ans++。 第二种情况就是边没有被覆盖,则删去该边即可分为两个连通块,所以任意删除一条附加边即可,ans += m。 对于如何进行覆盖,用树上边差分即可。 vector建图会t,用链式前向星存,常

gongyuandaye的博客 185

poj3417 Network (LCA+树上差分)

题意: Yixght是一家名为SzqNetwork(SN)的公司的经理。现在她非常担心,因为她刚刚收到一个坏消息,说SN的商业竞争对手DxtNetwork(DN)打算攻击SN的网络。更不幸的是,原始的SN网络太弱了,我们只能把它当作一棵树。在形式上,SN网络中有N个节点,节点之间有N-1个双向通道连接,并且任何节点之间都存在一条路由。为了保护网络免受攻击,Yixght在一些节点之间建立了M个新的双...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 296

POJ - 3417 Network ( 树上差分 + lca )

题意: 给出一个无向图,分别给出n-1条树边(主要边)和m条非树边(附加边),这个无向图可以看做一棵树外加m条附加边,你可以切 断一条主要边和一条附加边,求切割后,能够使这个无向图不再连通的切割方案数(即使只切断一条主要边就可以使图不连通,你 也需要再切断一条附加边) 分析: 我们先考虑只有一条附加边(x,y)时,这时这张图就是一棵基环树 我们发现如果x,y之间有一条附加边,则...

兜率工的博客 320
上一篇: 【JZOJ5223】B【矩阵乘法】【DFS】
下一篇: 【NOIP2018】【洛谷P5022】旅行【基环树】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值