AT-AGC004D-Teleporter

Teleporter-AT , Teleporter-LG

题目大意

有一个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;
} 
posted @ 2022-04-30 16:40  _yolanda  阅读(25)  评论(0编辑  收藏  举报