AT-AGC004D-Teleporter
题目大意
有一个n个点n条边的有向连通图,边权都是1,请你修改一些边的终点(不能修改边的起点),使得对于任何一个点,都存在一条长度为k的到达点1的路径(可以是非简单路径)
思路
一道思维题...
可以推出一号节点的边 一定 指向自己:每个点到 1 的路径只有一条,1 也一样,所以到 1 的距离一定是 1 本身到自己的距离 +n 就不可能等于 k 。
由此一来,只需要每个点到 1 的距离 \(\leq\) 即可。
这个时候就可以贪心了,dfs 的时候从底向上,每 \(k\) 个数就截断,接到 1 节点上去。这个在 dfs 的时候做点处理就好。
$Code$
//1的边一定指向自己
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int fa[N];
vector<int> son[N];
int n,k,ans,ma;
int f[N];
int dfs(int x,int dep){
int tmp=dep;
for(int i=0;i<son[x].size();++i){
int y=son[x][i];
tmp=max(tmp,dfs(y,dep+1));
}
if(tmp-dep==k-1){
if(fa[x]!=1)
fa[x]=1,++ans;
return dep-1;
}
return tmp;
}
int main(){
scanf("%d%d",&n,&k);
cin>>fa[1];
for(int i=2;i<=n;++i) scanf("%d",&fa[i]),son[fa[i]].push_back(i);
ans+=(fa[1]==1?0:1);fa[1]=1;
dfs(1,1);
cout<<ans;
return 0;
}