zoukankan      html  css  js  c++  java
  • hdu 4118 Holiday's Accommodation 树形dp

    点击打开链接

    题意:

    给出一个无向图,现在把所有的点的人都交换,保证每个地方只有一个人,且任何人都不在自己原来的那个点上,问交换的过程中所有人走的最远的距离是多少;

    思路:

    首先分析一下,我们对每一个边进行分析,每个边的左边有n个节点,右边有m个节点,那么必然ans+=min(n,m)*边权

    仔细想想,就很清楚,假设左边节点比右边少,那么我让左边的节点都到右边去,一定最优。

    树形dp:dp[u]表示包括u节点的子节点个数,对于红色的那条边 dp[2]=6, dp[4]=4。取min(4, n-4)*w*2


    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int maxn = 1e5+10;
     5 
     6 vector<pair<int,int> > G[maxn];
     7 ll dp[maxn],ans;
     8 int a[maxn];
     9 
    10 struct edge{
    11     int x,y,z;
    12 }E[maxn];
    13 
    14 void dfs(int u){
    15     dp[u] += 1;
    16     for(int i=0; i<G[u].size(); i++){
    17         int v = G[u][i].first;
    18         if(dp[v] == 0){
    19             dfs(v);
    20             dp[u] += dp[v];
    21         }
    22     }
    23 }
    24 
    25 int main(){
    26     int T; cin>>T;
    27     for(int cas=1; cas<=T; cas++){
    28         memset(dp,0,sizeof(dp));
    29         ans = 0;
    30         int n; cin>>n;
    31         for(int i=0; i<=n; i++) G[i].clear();
    32         for(int i=1; i<n; i++){
    33             cin >> E[i].x >> E[i].y >> E[i].z;
    34             G[E[i].x].push_back(make_pair(E[i].y,E[i].z));
    35             G[E[i].y].push_back(make_pair(E[i].x,E[i].z));
    36         }
    37         dfs(1);
    38 
    39         for(int i=1; i<n; i++){
    40             int k = min(dp[E[i].x],dp[E[i].y]);
    41             ans += min(k,n-k) * E[i].z * 2;
    42         }
    43 
    44         cout << "Case #" << cas << ": " << ans << endl;
    45     }
    46 }
  • 相关阅读:
    为什么学微信小程序开发
    mac 上配置sublime text3插件
    获取元素的宽度和高度
    移动端页面SEO优化需要注意的10个要点
    gulp详细入门教程
    HTTP协议详解
    深入了解 Flexbox 伸缩盒模型
    移动前端之viewport
    如何设置“用eclipse开发时自动在顶端产生import”?
    认识 java JVM虚拟机选项 Xms Xmx PermSize MaxPermSize 区别
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827733.html
Copyright © 2011-2022 走看看