首页 > 其他分享 >2020CCPC秦皇岛-K. Kingdom's Power(树形DP + 贪心)

2020CCPC秦皇岛-K. Kingdom's Power(树形DP + 贪心)

时间:2022-10-16 10:45:06浏览次数:70  
标签:Kingdom 子树 return minn Power int tree 2020CCPC 节点

题意

给出一个有n个节点的有根树,1 为根节点,根节点有无穷多个兵,每一秒可以让任意一个兵向任意一个地方移动一步,兵所到的点被占领,问最少需要经过多少秒,才能将所有的点都占领

思路

暴力走一遍,然后每次判断,

  • 是从根节点更新距离短
  • 还是从最近的节点更新距离短。
    最近的点可能是:父亲节点(第一次到达该点)也可能是子节点(从子节点遍历回来)。

然后对于一个子树,应该最后走最深的链
因为

  • 如果相邻的子树从根节点走下来士兵
    最深的链只走一次,其余的链都会走两次。长度最短。

  • 如果相邻的子树还是该树的士兵遍历
    所有的链都会走两次。长度最短。

因此,为了最后走最长链;对于每个子树,按照 最长链 进行排序,

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
const int N=1e6+10;
const int inf = 1e9+7;
int n;

vector<pii> tree[N];//单向边
int dep[N];//深度
int cnt[N];//距离
int ans;

//找子树最长链,并排序
int dfs1(int u,int d){
    if(tree[u].empty()) return 1;
    dep[u]=d;
    for(pii &x: tree[u])
        x.first=max(x.first,dfs1(x.second,d+1));
    sort(tree[u].begin(),tree[u].end());
    return tree[u].back().first+1;
}

//找到最小花费
int dfs2(int u,int  dis){
    cnt[u]=dis;
    if(tree[u].empty()) return 1;
    int minn=dis;
    for(pii it: tree[u])
        minn=min(dep[u],dfs2(it.second,minn+1));//维护距离与深度的最小值
    return minn+1;
}

void init(){
    for(int i =0;i<=n;i++)
        tree[i].clear();
    ans=0;
}

void solve() {
    init();
    cin >> n;
    int x;
    for (int i = 2; i <= n; i++) {
        cin >> x;
        tree[x].push_back({ 0,i });//深度,编号
    }

    dfs1(1, 0);
    dfs2(1, 0);

    for (int i = 1; i <= n; i++) 
    //当前点为叶子节点,更新答案
        if (tree[i].empty()) 
            ans += cnt[i];
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0); 
    cout.tie(0);
    int t=1;
    cin >> t;
    for (int i = 1; i <= t; i++) {
        solve();
        cout << "Case #" << i << ": " << ans << endl;
    }
    return 0;
}

标签:Kingdom,子树,return,minn,Power,int,tree,2020CCPC,节点
From: https://www.cnblogs.com/kingwz/p/16795738.html

相关文章

  • How to parallel power MOSFETs
    HitodayIwilldiscusshowtoparallelpowerMOSFETS.WhatisaffectingcurrentsharingandbestpracticestooptimizeyourdesignusinganXperiapowermosfet......
  • 2020CCPC绵阳L. Lottery(组合数学)
    题意:给出你n个箱子,每个箱子有一个对应的指数ai,和数量xi代表这个箱子内的大小为2^ai的彩票有xi张。然后想问你,用这些箱子中的彩票随意选择,最多能组成多少种和不重复的彩票......
  • 利用Power Pivot完成数据的“分类合并”问题!
    Excel情报局职场联盟Excel生产挖掘分享Excel基础技能Excel爱好者大本营用1%的Excel基础搞定99%的职场问题做一个超级实用的Excel公众号Excel是门手艺玩转需要勇气数万Excel......
  • PowerBI连接数据库,并可视化
    本节选取MySQL软件自带的数据文件,world数据库中含有city表,以该表的数据为例,使用PowerBI软件,连接数据库,数据清洗后,使用筛选器实现动态筛选效果,我们知道PowerBI软件具有良好的......
  • 如何处理Office Powerpoint打开WPS文件提示异常加载项的问题
    https://answers.microsoft.com/zh-hans/msoffice/forum/all/ppt-关闭加载项/88896ada-41ab-48ed-a83e-282619f04f191.单击“文件”>“选项”>“加载项”,2.朝窗口底部“......
  • 利用powershell批量升级DELL的idrac
    利用powershell批量升级DELL的idrac拓扑环境及工具环境:windows系统工具:racadm软件,下载地址链接racadm手册(pg97)链接我们这里用的是powershell语言,因为idrac管理机是......
  • Power shell执行策略(ExecutionPolicy)
    问题场景,node安装npminstall-gyarn,yarn --version命令无法查看yarn版本,提示yarn:无法加载文件C:\Users\FelishaHuang\AppData\Roaming\npm\yarn.ps1,因为在此系......
  • 如何以root管理员的身份唤起powershell?
    使用运行窗口打开带管理员权限的PowerShell1.按下组合键Windows+R以打开运行窗口。输入powershell然后按下回车键。2.WindowsPowerShell会以当前用户的权限去执行。3.......
  • PowerShell
    PowerShell在管理员权限下调整执行策略远程执行ps脚本两个要求:远程主机身份经过验证,为可信任主机为满足第一个要求,远端主机必须经过域服务器验证。最佳应对方法时将......
  • PowerMill 2023软件安装包和安装教程
    PowerMill2023软件简介:PowerMill2023是款顶级的数控加工编程软件系统。能使用户方便有效地制造最复杂的模具、钢型和其他组件,具备完整的加工方案,对预备加工模型不需人为干......