K. Kingdom's Power 题解(思维+贪心)

题目链接

题目思路

对于这种题目不太会写

参考博客

本质上思路就是考虑转移

所以考虑每个叶子节点的状态 :

1.从根节点直接到达该节点u

2.从上一个节点转移过来

注意代码第\(18\)行加取地址符号

代码

#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
const int maxn=1e6+5;
ll ans=0;
int n,tot;
int dep[maxn];
int tmp=0;
int pre=-1;
vector<pair<int,int> >g[maxn];
int dfs1(int now,int len){
    dep[now]=len;
    if(g[now].empty()){
        return 0;
    }
    for(auto &x:g[now]){
        x.fi=dfs1(x.se,len+1);
    }
    sort(g[now].begin(),g[now].end());
    return g[now].back().fi+1;
}
void dfs2(int now){
    if(g[now].empty()){
        if(pre==-1) ans+=dep[now];
        else ans+=min(tmp,dep[now]);
        pre=now;
        tmp=0;
        return ;
    }
    for(auto x:g[now]){
        tmp++;
        dfs2(x.se);
        tmp++;
    }
}
signed main(){
    int _;scanf("%d",&_);
    while(_--){
        scanf("%d",&n);
        ans=tmp=0;
        pre=-1;
        for(int i=1;i<=n;i++){
            g[i].clear();
        }
        for(int i=2,x;i<=n;i++){
            scanf("%d",&x);
            g[x].push_back({0,i});
        }
        dfs1(1,0);
        dfs2(1);
        printf("Case #%d: %lld\n",++tot,ans);
    }
    return 0;
}

posted @ 2022-02-11 21:04  hunxuewangzi  阅读(83)  评论(0编辑  收藏  举报