HDU 6228 思維 樹上dfs
阿新 • • 發佈:2018-12-16
題意:給你一棵樹,讓你把這些樹上的節點用M種顏色染,然後問你在最優的染色方案下,相同顏色點連線的最小邊集的交集最大是多少。
就是問一條邊上的兩端,如果上端的點數大於k,並且下端的點數小於k,那麼這條邊將計數。
先用DFS求出每個點的子孫節點個數(包括自身),假設為x,那麼它的上面點的個數為n-x,只要x>=k&&(n-x)>=k,ans++。
#include<bits/stdc++.h> using namespace std; #define mst(a,b) memset((a),(b),sizeof(a)) #define rush() int T;scanf("%d",&T);while(T--) typedef long long ll; const int maxn = 200005; int n,k,ans; int num[maxn]; vector<int>vec[maxn]; void dfs(int u,int pre) { num[u]=1; for(int i=0;i<vec[u].size();i++) { int v=vec[u][i]; if(v==pre) continue; dfs(v,u); num[u]+=num[v]; } } int main() { int u,v; rush() { mst(num,0); scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { vec[i].clear(); } for(int i=1;i<n;i++) { scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } ans=0; dfs(1,-1); for(int i=1;i<=n;i++) if(num[i]>=k&&n-num[i]>=k) ans++; printf("%d\n",ans); } return 0; }