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;
}
不摆烂了,写题