[Lydsy1806月赛] 超速摄像头
可以证明只要叶子两两路径满足条件即可,于是便可以贪心啦,从最外圈(叶子)开始一层一层选,选出前 k/2 层。
如果k是奇数的话,还可以多选一个不是前 k/2 层的点。
#include<bits/stdc++.h> #define ll long long using namespace std; #define pb push_back const int N=1e6+5; inline int read(){ int x=0; char ch=getchar(); for(;!isdigit(ch);ch=getchar()); for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x; } vector<int> g[N]; queue<int> q; int n,k,len[N],ans,l,d[N]; bool flag; inline void solve(){ for(int x;!q.empty();q.pop()){ x=q.front(); for(int j=g[x].size()-1,i;j>=0;j--){ i=g[x][j]; if((--d[i])==1) q.push(i),len[i]=len[x]+1; } } } int main(){ n=read(),k=read(),l=k>>1; for(int i=1,uu,vv;i<n;i++){ uu=read(),vv=read(),d[uu]++; g[uu].pb(vv),g[vv].pb(uu),d[vv]++; } for(int i=1;i<=n;i++) if(d[i]==1) q.push(i),d[i]--; solve(); for(int i=1;i<=n;i++) if(len[i]<l) ans++; else flag=1; ans+=(k&1)&flag,printf("%d\n",ans); return 0; }
我爱学习,学习使我快乐