hdu6060 一次就懂 dfs+思维 多校第三场1005
来源:互联网 发布:新版淘宝怎么充话费 编辑:程序博客网 时间:2024/05/21 09:47
题意
给出一颗n个节点的树,要求将2-n号节点分成k个集合,然后对于每个集合加上1号节点算一个联通的最小花费(最小斯坦纳树),定义为每一部分的value,问总的value最大可能是多少。
题解
因为给出的n个节点本身满足是一个树,所以对于每个集合求的最小斯坦纳树其实就是最小生成树就是在给出树中联通集合所有节点加上1号节点的所有边权和。
因为每个集合都包含1这个点,因此对于每个点都至少有一条到1的路径。可以从1开始DFS,对于每个点u,它和父亲的边的贡献最多可以是min(son[u], k)(son[u]表示包含u的所有子节点的个数)。因为可以把u的儿子结点分在不同的k个集合里面,这些儿子结点都必须经过u和父亲的边才能到达1。所以这条边对于结果的最大贡献就是边权*min(son[u],k)。然后通过dfs得出所有son[]和edge_wight[]。
具体可看代码注释。
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e6+5;int n,k;//son[i]保存i节点的所有子节点的个数(包括i节点)//edge_wight[i]保存i节点和其父节点的边权int son[maxn],edge_wight[maxn];struct Edge{ int to,len; Edge(int a,int b) { to = a; len = b; }};vector<Edge> edge[maxn];void dfs(int root,int fa){ son[root]=1; //遍历与root相连的点 for(int i=0;i<edge[root].size();i++) { int next = edge[root][i].to; if(next==fa) continue; edge_wight[next] = edge[root][i].len; dfs(next,root); son[root] += son[next]; }}int main(){ //freopen("in.txt","r",stdin); while(~scanf("%d%d",&n,&k)) { int u,v,len; for(int i=1;i<=n;i++) edge[i].clear(); for(int i=1;i<n;i++) { scanf("%d%d%d",&u,&v,&len); //加边 edge[u].push_back(Edge(v,len)); edge[v].push_back(Edge(u,len)); } dfs(1,0); ll ans=0; //这里因为edge_wight[]开的是全局,自动赋0值,所以edge_wight[1]就是0,其它值通过dfs得出,不用初始化 for(int i=1;i<=n;i++) ans += 1ll*edge_wight[i]*min(son[i],k); printf("%lld\n",ans); } //printf("Time used = %.2f\n",(double)clock() / CLOCKS_PER_SEC); return 0;}
阅读全文
0 0
- hdu6060 一次就懂 dfs+思维 多校第三场1005
- 多校第三场 1005 HDU 6060 思维贪心+dfs+一维建树
- hdu 6060 RXD and dividing 2017多校第三场第五题(思维+dfs)
- hdu5762(2016多校第三场,思维题)
- hdu6058 链表+思维 2017多校第三场1003
- [dfs]多校联合第三场 K Work
- 2017多校第一场 HDU 6044 Limited Permutation 思维,计数,DFS
- 2017杭电多校第三场1005 RXD and dividing(最大化k个斯坦纳树分块的最大权值和)HDU6060
- 2017杭电多校联赛第三场-RXD and dividing (hdu6060)最小生成树
- 多校第三场
- 多校第三场
- 2017第三次多校联合hdu6060
- 【HDU6060】RXD and dividing(dfs)
- HDU6060 RXD and dividing【DFS】
- 多校第三场 1006 hdu 5323 Solve this interesting problem(dfs)
- hdu多校第三场 Solve this interesting problem (5323 线段树模拟 + DFS)
- 2017年多校赛第三场 1005 RXD and dividing(DFS)
- 多校联赛 第三场
- 马的走法
- Error inflating class com.ryanharter.viewpager.ViewPager 这个问题 尝试下面方法 解决 选择Build Path ->Configure Bui
- Linux入门笔记7. ubuntu上部署Nginx+uWSGI+Django
- 二分查找
- DOM节点删除之detach()和remove()区别
- hdu6060 一次就懂 dfs+思维 多校第三场1005
- codeforces 835D
- c++ string对象 空格替换
- HDU3231Box Relations【拓扑排序】
- day5-java&oracle总结
- Java中Integer和int的区别
- css样式、属性
- 原生js中的相关操作
- 优雅的使用optional