gym 100496 House of Representatives(树形dp)
2015-07-14 10:15
232 查看
House of Representatives
思路:设根为1 先dfs一遍把各个节点到根的距离。然后第二遍把根轮换一下,最后比较距离的大小,最小即所求
思路:设根为1 先dfs一遍把各个节点到根的距离。然后第二遍把根轮换一下,最后比较距离的大小,最小即所求
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; #define N 1111111 ll dp ; int a ; ll sum ,ans ; struct EDGE { int v, next; ll w; } edge ; int head , e; int n, k, vis ; void init() { memset(vis, 0, sizeof(vis)); memset(head, -1, sizeof(head)); e = 0; } void add(int u, int v, int w) { edge[e].v = v; edge[e].w = w; edge[e].next = head[u]; head[u] = e++; } void dfs_dis(int u,int fa) { //printf("%d %d\n",u,fa); sum[u] = a[u]; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; if(v != fa &&!vis[v]) { vis[v]=1; dfs_dis(v, u); sum[u] += sum[v]; dp[u] += dp[v]+sum[v]*edge[i].w; } } } void dfs(int u, int fa,ll val) { ans[u] = dp[u] + val; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; if(v != fa ) { ll tmp = val; tmp += (dp[u]-dp[v]); tmp += ((sum[1]-sum[v])*edge[i].w-sum[v]*edge[i].w); dfs(v, u,tmp); } } } int main () { freopen("house.in","r",stdin); freopen("house.out","w",stdout); scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } int c,b; ll w; init(); for(int i=1; i<n; i++) { scanf("%d%d%I64d",&c,&b,&w); add(c,b,w); add(b,c,w); } dfs_dis(1,-1); dfs(1,-1,0); int k = 1; for(int i=1; i<=n; i++) { if(ans[k]>ans[i]) { k=i; } } printf("%d %I64d\n",k,ans[k]); }
相关文章推荐
- 读书笔记-深入理解JVM虚拟机-1.OOM初探
- ERP的管理思想
- dataBingding 使用 范例
- Elasticsearch_安装配置(对应插件)
- android在String资源文件中加入符号
- 42、使用存放在存assets文件夹下的SQLite数据库
- hdu 5073 Galaxy 2014 Asia AnShan Regional Contest
- shell脚本示例,start stop restart
- 悟空学Linux专栏----第37篇
- UVA - 1326 Jurassic Remains
- 一步一步JavaEE
- 网页中嵌入视频
- jenkins安装入门
- CXF实现webService服务(一)
- 【JavaWeb】(6)Servlet
- 当使用easyui时,jquery的设置disabled属性方法失效
- POJ - 2828 Buy Tickets (段树单点更新)
- NSURLConnection基本使用
- 树形菜单复选框级联选择HTML
- 贪心/思维题 UVA 11292 The Dragon of Loowater