问题:
有一个树形结构的电路板,其中有一个激发器(根节点),电流从根节点出发,沿着树边传播到所有叶子节点(终止节点)。每条边有一个传播时间,我们需要通过增加某些边的传播时间,使得所有叶子节点同时接收到电流。
解法:
贪心:
从叶子节点开始向上处理
对于每个节点,计算从其到其子树中叶子节点的最大路径长度
对于节点的每个子节点,将它们的路径长度补齐到这个最大值
向上传递时,加上当前节点到父节点的边权
算法:
使用BFS或DFS建立树结构(因为N很大,需要避免递归深度过大)
通过拓扑排序(从叶子到根)处理节点
对于每个节点:
找到所有子节点中的最大f[y]+w(即最大路径长度)
将所有子节点的路径长度补齐到这个最大值
当前节点的f[x]=这个最大值
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=500010;
int h[N],v[N<<1],nxt[N<<1],cnt,d[N<<1];
long long res,f[N];
int q[N],fa[N];
void add(int x,int y,int z)
{
v[++cnt]=y;
d[cnt]=z;
nxt[cnt]=h[x];
h[x]=cnt;
}
int main()
{
int n,st;
scanf("%d%d",&n,&st);
for(int i=1;i<n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
int l=0,r=0;
q[0]=st;
fa[st]=0;
while(l<=r)
{
int x=q[l++];
for(int i=h[x];i;i=nxt[i])
{
int y=v[i];
if(y==fa[x]) continue;
fa[y]=x;
q[++r]=y;
}
}
for(int i=r;i>=0;i--)
{
int x=q[i];
long long mx=0;
for(int j=h[x];j;j=nxt[j])
{
int y=v[j],w=d[j];
if(y==fa[x]) continue;
f[x]=max(f[x],f[y]+w);
}
for(int j=h[x];j;j=nxt[j])
{
int y=v[j],w=d[j];
if(y==fa[x]) continue;
res+=f[x]-(f[y]+w);
}
}
printf("%lld\n",res);
return 0;
}
P1131题解
张小明
前端开发工程师
Linux权限管理知识点
一、文件权限管理主要学习一下三大权限Linux系统的三大基本权限Linux系统的三大特殊权限Linux系统的精细化权限管理ACL权限问题:为什么需要文件权限???答:因为没有文件权限控制,则系统所有人都可以查看和修…
Java+Playwright自动化测试-31- 操作日历时间控件-上篇(详细教程)
我们在实际工作或者生活中,有可能遇到有些web产品,网页上有一些时间选择,然后支持按照不同时间段范围去筛选数据,例如:我们预定火车票或者预定酒店,需要选择发车日期或者酒店的入住与退房时间。宏哥早在之前…
开源AI智能名片链动2+1模式商城小程序在垂直领域的应用与市场潜力分析
摘要:本文聚焦开源AI智能名片链动21模式商城小程序在垂直领域的应用,探讨其对提升用户黏性和购买能力的作用,分析该模式在垂直领域的市场潜力。通过对相关案例和数据的分析,揭示其创新价值和发展前景,为垂直领域电商发…
周报不是流水账,这个AI指令帮你写出让老板点赞的工作汇报
写在前面每周五下午,看到"本周工作总结"的提醒,是不是就头疼?明明忙了一周,但真要写周报时,脑子里一片空白。想了半天只憋出几句话:"本周完成了XX功能开发,测试通过,…
Revive Adserver:开源广告服务器系统完整指南
在当今数字营销时代,拥有一个强大的广告管理系统对于网站所有者至关重要。Revive Adserver作为全球最受欢迎的免费开源广告服务器系统,为各类用户提供了一套完整的解决方案,无论是小型企业还是大型媒体公司,都能从中受益。&#x…
【Qt开源项目】— ModbusScope-day 1
学习核心思想 笔记驱动:以你手中的笔记为核心路线图和知识库,避免在浩瀚源码中迷失。问题导向:每学习一个模块,先问自己:它为什么存在?解决了什么问题?在整体中扮演什么角色?流程串联…