P3942 将军令
自己造的一组hack数据打错一个数字,自闭—— 凸(艹皿艹 )
本质是一个贪心,策略是建边,以任意底为根,排最深的点再贪它。
预处理深度,遍历顺序。寻找覆盖最远的点,自下向上不到必须不选,子树向上覆盖。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int read(){ 4 int a=1,b=0;char t; 5 while(t<'0'||t>'9'){ 6 if(t=='-') a=-1; 7 t=getchar(); 8 } 9 while(t>='0'&&t<='9') b=b*10+t-'0',t=getchar(); 10 return a*b; 11 } 12 #define maxn 100010 13 #define F(i,a,b) for(int i=a;i<=b;i++) 14 15 int n,k,ans,tot; 16 /* 17 struct edge{ 18 int to,nxt; 19 }ea[maxn]; 20 21 int dfs(int u,int fa){ 22 int v,minm=0,maxm=0; 23 for(int i=head[u];i;i=ea[i].nxt){ 24 v=dfs(ea[i].to,u); 25 if(ea[i].to!=fa){ 26 if(v<0) minm=min(minm,v); 27 else maxm=max(maxm,v); 28 } 29 } 30 if(maxm>-minm) return maxm-1; 31 if(-minm==k||u==1) return ++ans,k; 32 return minm-1; 33 }*/ 34 struct edge{ 35 int v; 36 edge *nxt; 37 } pool[maxn<<1],*tp=pool,*head[maxn]; 38 int dfs(int x,int fa){ 39 int t,mn=0,mx=0; 40 for (edge *i=head[x];i;i=i->nxt) 41 if (i->v!=fa) 42 (t=dfs(i->v,x))<0? mn=min(mn,t):mx=max(mx,t); 43 if(mx>-mn) return mx-1; 44 if(-mn==k||x==1) return ++ans,k; 45 return mn-1; 46 } 47 int main(){ 48 n=read(),k=read(),read(); 49 F(i,1,n-1){ 50 int u=read(),v=read();/* 51 ea[++tot].nxt=head[u],head[u]=tot,ea[tot].to=v; 52 ea[++tot].nxt=head[v],head[v]=tot,ea[tot].to=u;*/ 53 *tp=(edge){v,head[u]},head[u]=tp++; 54 *tp=(edge){u,head[v]},head[v]=tp++; 55 } 56 dfs(1,0); 57 cout<<ans; 58 }
Cogito ergo sum