Decrement on the Tree

本文深入探讨了一种基于路径覆盖的算法,重点分析了如何通过计算路径的起点和终点数量来确定覆盖路径的数量,特别是在存在权重极大边的情况下。文章提供了一个详细的C++实现案例,包括初始化、更新和查询操作,适用于解决特定类型的图论问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
我们发现有几次操作就是覆盖几条路径,所以我们只要关注路径的起点和终点,路径数就是起点终点的数量和的一半
如果有一边的权值很大,超过了其他所有边的权值和,必然会出现某条边非常多的情况,起点和终点的数量就为这条边的数量乘2 。
代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m;
int x[N],y[N];
long long w[N],v[N];
multiset<long long,greater<long long> >s[N];
long long date(int i)
{
    long long mx=*s[i].begin();
    if(mx*2>v[i])return mx*2-v[i];
    return v[i]%2;
}
int main()
{
    int i,j;
    scanf("%d%d",&n,&m);
    long long ans=0;
    for(i=1;i<n;i++)
	{
        scanf("%d%d%lld",&x[i],&y[i],&w[i]);
        v[x[i]]+=w[i],v[y[i]]+=w[i];
        s[x[i]].insert(w[i]),s[y[i]].insert(w[i]);
    }
    for(i=1;i<=n;i++) ans+=date(i);
    
    printf("%lld\n",ans/2);
    while(m--)
	{
        int p;
        long long nv;
        scanf("%d%lld",&p,&nv);
        ans-=date(x[p])+date(y[p]);
        v[x[p]]-=w[p],v[y[p]]-=w[p];
        s[x[p]].erase(s[x[p]].find(w[p]));
        s[y[p]].erase(s[y[p]].find(w[p]));
        w[p]=nv;
        v[x[p]]+=w[p],v[y[p]]+=w[p];
        s[x[p]].insert(nv);
        s[y[p]].insert(nv);
        ans+=date(x[p])+date(y[p]);
        printf("%lld\n",ans/2);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值