1. 程式人生 > >AGC004D Teleporter

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; }