hdu3899(树形dp)
来源:互联网 发布:淘宝客怎么赚佣金 编辑:程序博客网 时间:2024/06/07 00:22
链接:点击打开链接
题意:给出一棵树每个点的权值和每条边的长度,点j到点i的代价为点j的权值乘以连接i和j的边的长度,输出点x,使得所有点到x点的代价最小
代码:
#pragma comment(linker, "/STACK:102400000,102400000")#include <vector>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;long long dp[100005],vis[100005];long long sum,ans[100005],val[100005];struct node{ long long to,cost; node(long long x,long long y){ to=x; cost=y; }};vector<node> G[100005];void dfs1(long long s,long long sum){ long long i,tmp,cnt; vis[s]=1; for(i=0;i<G[s].size();i++){ tmp=G[s][i].to; if(vis[tmp]) continue; cnt=sum+G[s][i].cost; ans[1]+=cnt*val[tmp]; //求出根节点的值 dfs1(tmp,cnt); dp[s]+=dp[tmp]; //并求出每个节点所有子树节点权值的和 }}void dfs2(long long s){ long long i,tmp; vis[s]=1; for(i=0;i<G[s].size();i++){ tmp=G[s][i].to; if(vis[tmp]) continue; ans[tmp]=ans[s]+(sum-dp[tmp])*G[s][i].cost-dp[tmp]*G[s][i].cost; dfs2(tmp); //画图就可以看出父节点的值和子节点的值的关系 }}int main(){ //这类题都是求出根节点的值,再由一些关系推出每个节点的值 long long n,i,j,u,v,w,sol; while(scanf("%I64d",&n)!=EOF){ sum=0; for(i=1;i<=n;i++) G[i].clear(); for(i=1;i<=n;i++){ scanf("%I64d",&dp[i]); val[i]=dp[i]; sum+=val[i]; } for(i=1;i<n;i++){ scanf("%I64d%I64d%I64d",&u,&v,&w); G[u].push_back(node(v,w)); G[v].push_back(node(u,w)); } memset(ans,0,sizeof(ans)); memset(vis,0,sizeof(vis)); dfs1(1,0); memset(vis,0,sizeof(vis)); dfs2(1); sol=ans[1]; //注意不要开成0x3f3f3f3f for(i=2;i<=n;i++) sol=min(sol,ans[i]); printf("%I64d\n",sol); } return 0;}
1 0
- 【树形DP】 hdu3899 JLUCPC
- hdu3899(树形dp)
- hdu3899 JLUCPC--树形dp(好题)
- hdu3899树中选择开会地点(树,树形DP) 多校六1010
- 树形dp
- 树形DP
- 树形dp
- 树形DP
- 树形dp
- 树形DP
- 树形DP
- 树形DP
- 树形DP
- 树形dp
- 树形dp
- 树形dp
- 树形dp
- 树形DP
- 【后缀数组】[NOI2016]优秀的拆分
- Android中的广播Broadcast详解
- hdu 5363 Key Set
- android 调用系统相机或者系统相册功能时,onActivityResult方法不执行问题的解决过程
- TCP及DNS协议(3)
- hdu3899(树形dp)
- Android中ContentProvider简介
- HDU_1561_TheMore,TheBetter(有依赖背包&&树状dp)
- III
- Handler使用引起内存泄漏分析
- 添加网卡驱动和USB支持 以及一些问题的集中处理
- Idea的配置与maven项目导入步骤
- java基础--12.Scanner和String类
- 广义表的head与tail的基本用法