AGC004D Teleporter

传送门

题目大意

有n个城市,每个城市有一个传送点,都可以传送到唯一的另外一个城市,保证从任何位置出发经过若干次传送之后能够到达1号城市。现在希望修改一些点的目的地,使得从任何一点出发在传送K次之后恰好都能到达1号城市,求最少要改变目的地的城市的数量。

分析

比较典型的贪心

从下往上搜索,每当深度为k时就将这整个子树接到1上

注意1必须连1,所以特判一下即可

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
vector<int>v[100100];
int n,m,siz[100100],Ans;
inline void dfs(int x,int fa){
    siz[x]=1;
    for(int i=0;i<v[x].size();i++)
      if(v[x][i]!=fa){
          dfs(v[x][i],x);
          siz[x]=max(siz[x],siz[v[x][i]]+1);
      }
    if(fa!=1&&siz[x]==m)siz[x]=0,Ans++;
}
int main(){
    int i,j,k;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++){
      int x;
      scanf("%d",&x);
      if(i==1&&x!=1)Ans=1;
      if(i>1)v[x].push_back(i),v[i].push_back(x);
    }
    for(i=0;i<v[1].size();i++)dfs(v[1][i],1);
    printf("%d\n",Ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/yzxverygood/p/10052374.html