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

十二冶金建设集团有限公司网站刷seo排名

十二冶金建设集团有限公司网站,刷seo排名,网络公司 网站建设 小程序,网络游戏定义文章目录 题目大意题解参考代码 题目大意 ( 0 ≤ a i ≤ 1 ) , ( 1 ≤ c o s t i ≤ 1 0 9 ) (0\leq a_i\leq 1),(1 \leq cost_i\leq 10^9) (0≤ai​≤1),(1≤costi​≤109) 题解 提供一种新的算法,kruskal重构树。 该算法重新构树,按边权排序每一条边…

文章目录

  • 题目大意
  • 题解
  • 参考代码

题目大意

翻译
( 0 ≤ a i ≤ 1 ) , ( 1 ≤ c o s t i ≤ 1 0 9 ) (0\leq a_i\leq 1),(1 \leq cost_i\leq 10^9) (0ai1),(1costi109)

题解

提供一种新的算法,kruskal重构树。
该算法重新构树,按边权排序每一条边后,
新建一个点为“两边的节点所在最大节点”的父节点,该点点权为该边边权。
该树有一些特征:
①:是一个二叉树。
③:原节点全部为叶节点。
②:两个节点的LCA的点权就是其原最短路径的最大边权。
具体 Kruskal 算法学习
建树可以用并查集计算。
了解了这个算法我们再看问题,要求最大边权,这点可以用kruskal维护。
对于某个不为叶节点的节点 x x x ,它左儿子与右儿子匹配的黑白节点的最大边权显然为 w x w_x wx
显然的,我们可以枚举左右儿子节点中的黑白节点个数,乘上点权,即为该点的贡献。
我们发现答案可以通过 d f s dfs dfs 顺序从下往上来求解,且不会造成前效性,所以树形DP可以很好的解决这道题。
d p x , b dp_{x,b} dpx,b 表示在 x x x 的子树内有 b b b 个黑色节点的最优解。
d p x , b = m a x ( d p s o n , b l a c k 1 + d p s o n , b 2 + w x ∗ ( b l a c k 1 ∗ w h i t e 2 + b l a c k 2 ∗ w h i t e 1 ) ) dp_{x,b}=max(dp_{son,black1}+dp_{son,b2}+w_x*(black1*white2+black2*white1)) dpx,b=max(dpson,black1+dpson,b2+wx(black1white2+black2white1))
white/black_1/2表示1/2的子树中有几个白色/黑色节点
且black1+black2=b
我们发现枚举 b b b 的黑白分布情况,最多需要合并 m i n ( s u m s o n l , s u m s o n r ) min(sum_{sonl},sum_{sonr}) min(sumsonl,sumsonr)次,
不然的话就需要从大的部分取一部分给数量少的一颗子树。
特殊的,对于叶节点
d p x , b = ( w x = = b ˆ 1 ) ∗ − c o s t x dp_{x,b}=(w_x==b \^\ 1)*-cost_x dpx,b=(wx==b ˆ1)costx
剩下的就好处理多了,写个DFS遍历一下即可处理。
计算时间复杂度,对于kruskal重构树,合并时长度最大为 l o g n log_n logn
即时间复杂度为 O ( N 2 l o g N ) O(N^2log_N) O(N2logN) 可以通过。

参考代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=6e3+5;
const int inf=1e18+7;
struct node{int x,y,w;
}f[N];
int fa[N],cost[N];
int w[N];
int n,m,t,ans;
int sonl[N],sonr[N];
int sum[N];
int dp[N][3000];
void dfs(int x)
{if(x<=n)                   //叶节点{dp[x][0]=(w[x]==1)*(-cost[x]);dp[x][1]=(w[x]==0)*(-cost[x]);
//        cout<<x<<" "<<0<<" "<<dp[x][0]<<endl;
//        cout<<x<<" "<<1<<" "<<dp[x][1]<<endl;sum[x]=1;}else{dfs(sonl[x]);dfs(sonr[x]);int res=min(sum[sonl[x]],sum[sonr[x]]);           //启发式合并平均复杂度为log_nsum[x]=sum[sonl[x]]+sum[sonr[x]];for(int i=0;i<=sum[sonl[x]];i++)for(int j=0;j<=sum[sonr[x]];j++)dp[x][i+j]=-inf;for(int i=0;i<=sum[sonl[x]];i++)           //枚举黑色节点个数{for(int j=0;j<=sum[sonr[x]];j++)              //DP转移{int s=dp[sonl[x]][i]+dp[sonr[x]][j]+w[x]*(i*(sum[sonr[x]]-j)+(sum[sonl[x]]-i)*j);dp[x][i+j]=max(dp[x][i+j],s);ans=max(ans,dp[x][i+j]);}}            }
}
int cmp(node a,node b)
{return a.w<b.w;
}
int sf(int x)
{if(fa[x]==x)return x;return fa[x]=sf(fa[x]);
}
signed main()
{cin>>n;for(int i=1;i<=n;i++)scanf("%lld",&w[i]);for(int i=1;i<=n;i++)scanf("%lld",&cost[i]);for(int i=1;i<n;i++)scanf("%lld%lld%lld",&f[i].x,&f[i].y,&f[i].w);sort(f+1,f+n,cmp);t=n;for(int i=1;i<=2*n;i++)fa[i]=i;for(int i=1;i<n;i++)             //kruskal构树{int x=sf(f[i].x),y=sf(f[i].y);fa[x]=++t;fa[y]=t;w[t]=f[i].w;sonl[t]=x;sonr[t]=y;}dfs(t);printf("%lld",ans);
}
http://www.yayakq.cn/news/387146/

相关文章:

  • php 网站开发模式江苏省建筑业网证书查询
  • 个人网站源代码下载天津企业网站建设开发维护
  • 南京新标特企业网站哪家广告做的网站备案提交信息吗
  • 乘客电梯做推广的网站餐饮环境评估在哪个网站做
  • 互联网网站 有哪些邢台哪儿做网站便宜
  • 建设工程消防设计备案网站盐城网站建设找宇联
  • 公司网站建设需求分析企业门户网站开发任务书
  • 做电影网站需要注意事项顺企网下载安装手机版
  • 好的地产设计网站服装网站模板
  • 医疗网站建设效果网页游戏电脑版
  • 为什么做网站要用谷歌浏览器怎么部署wordpress
  • 企业门户网站案例建站交流
  • 如果网站没有做icp备案会被处罚可视化的做网站的app
  • 什么是网页和网站程序员给女盆友做的网站
  • 简诉网站建设的基本流程全球室内设计公司排名
  • 在哪查找网站的建设者上海闵行区邮编
  • 毕业设计代做淘宝好还是网站好云南网警
  • 福建工程建设中心网站建站公司 phpwind
  • 网站开发5000简约创意logo图片大全
  • 网站做中转爱链
  • 在360上做网站多少钱去韩国用什么地图导航
  • 有后台网站怎么做产品发布网站的装饰怎么做
  • 网站建设仟首先金手指15企业seo网站营销推广
  • jquery网站开发实例上海出大事啦
  • 去后台更新一下网站php手机网站制作
  • 网站建设与管理题目怎样做电商 入手
  • 苏州哪家网站建设域名的网站建设方案书
  • 珠海市外贸网站建设公司网站建设能不能使用模板
  • 公司网站备案电话展厅设计公司选四度科技
  • 建个简单的网站无锡网站改版