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

HDU3586-Information Disturbing

HDU3586-Information Disturbing

题目大意

给你一棵树,你可以花费 \(w_i\) 去切断一条边。你的目标是切断每个叶子节点到根节点 \(1\) 的联系。要求在切断的总花费不大于 \(m\) 的条件下,最小化切断边的花费 \(w\) 的最大值。 无论如何都做不到,则输出 \(-1\)

题解

考虑二分答案,难点在于怎么check。

对于一个结点,要么切断连接它和父节点的边,要么子树下的叶子节点全部被切断的总花费。所以从叶子节点开始拓扑 \(bfs\) ,可以算出到根节点 \(1\) 为止的最小花费。\(check\) 时,只有小于 \(mid\) 的边才可以被切断。

如果二分结果 \(\geq 1000\) ,则无解输出 \(-1\)

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define umap unordered_map
#define endl '\n'
using namespace std;
using i128 = __int128;
const int mod =1e9+7;
template <typename T>void read(T&x){x=0;int f = 1;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);x*=f;
}
template <typename T>void print(T x) {if (x < 0) { putchar('-'); x = -x; }if (x > 9) print(x / 10);putchar(x % 10 + '0');
}
#define int long long
const int N=500005;
const int M=2000005;
int n,m;
vector<pair<int,int> > G[2000];
vector<int> fa(2000);
vector<int> deg(2000);
vector<int> ww(2000);
vector<int> minn(2000,1e18);
void dfs1(int u,int f)
{fa[u]=f;for(auto [v,w]: G[u]){if(v==f) ww[u]=w;if(fa[v]!=v) continue;dfs1(v,u);}
}
inline void solve()
{for(int i=1;i<=n;i++) fa[i]=i,deg[i]=0,minn[i]=0,G[i].clear();for(int i=1;i<n;i++){int u,v,w;cin>>u>>v>>w;G[u].push_back({v,w});G[v].push_back({u,w});deg[u]++,deg[v]++;}dfs1(1,0);int l=1,r=1005;while(l<r){int mid=l+r>>1;queue<int> q;vector<int> _deg=deg;for(int i=1;i<=n;i++) minn[i]=0;for(int i=2;i<=n;i++){if(_deg[i]==1){q.push(i);_deg[i]=0;minn[i]=1e10;}}while(!q.empty()){int u=q.front();q.pop();if(ww[u]<=mid) minn[fa[u]]+=min(ww[u],minn[u]);else{minn[fa[u]]+=minn[u];}if(--_deg[fa[u]]==1&&fa[u]!=1){q.push(fa[u]);}}if(minn[1]<=m){r=mid;}else{l=mid+1;}}if(r>=1000) cout<<-1<<endl;else cout<<r<<endl;
}signed main()
{
//	ios;int T=1;
//	cin>>T;for(;T;) {cin>>n>>m;if(n==0&&m==0) break;solve();}return 0;
}
http://www.jsqmd.com/news/45936/

相关文章:

  • 【App Service】.NET 应用在App Service上内存无法占用100%的问题原因
  • 深入解析:css 的 clip-path 属性,绘制气泡
  • 快速构建一个基础、现代化的 WinForm 管理系统!
  • 国内外研究现状全面解析:掌握学术前沿的必备指南
  • 费马小定理在素数检测中的应用
  • 把 1688 商品详情「搬进 MySQL」:Java 爬虫全链路实战(2025 版) - 实践
  • 深入解析:从传统架构到云原生,如何应对数据增长挑战?
  • 50036_基于微信小程序的智能点餐推荐系统
  • 【NAOI】题解
  • Windows系统基础安全浅谈
  • 深入解析:医疗多模态共情推理与学习一体化网络Python实现(2025扩充版)
  • curl/libcurl SMTP CRLF注入漏洞深度分析
  • 2025年11月氨基酸水溶肥,花芽分化氨基酸水溶肥,低温酶解氨基酸水溶肥厂家最新推荐,权威测评与种植选择指南!
  • 2025年11月沣硕40+中微量元素水溶肥,防裂果中微量元素水溶肥,促花稳果中微量元素水溶肥厂家推荐:规模化种植适配品牌
  • 4.6.4版本闪亮登场~赶快了解一下新内容吧
  • 2025年11月花芽分化氨基酸水溶肥,膨果上色氨基酸水溶肥,高含量氨基酸水溶肥厂家推荐,实测促产效果与品牌解析!
  • XMind for Mac v24.01.dmg 安装教程(Mac思维导图软件下载安装步骤)
  • 自动类型推导、智能指针、Lambda表达式和函数包装器 - 详解
  • RocketMQ 概念介绍 - 邓维
  • fio linux
  • find linux 文件
  • Docker主机网络优化咋做
  • C语言小程序在日常生活中的应用实例
  • Docker桥接网络能实现跨主机吗
  • fastdb c++如何优化存储结构
  • Docker客户端支持哪些存储驱动
  • c语言实现linux命令
  • discuz使用mysql有哪些注意事项
  • discuz与mysql数据迁移怎样操作
  • c语言在linux