HDU - 6228 Tree ( DFS

题意:

给k个颜色 将树进行染色, 染色后相同的两个点的之间的边的交集最大, 当然了 有的点不用的话 那么就是空集了, 这肯定是不行的 q w q qwq qwq

考虑枚举每一条边, 也就是 一个点的左右子树,如果两个子树的 s z sz sz都大于 k k k的话,那当然就是可以的啦

#include <bits/stdc++.h>
using namespace std;

#define cpp_io() {ios::sync_with_stdio(false); cin.tie(NULL);}
#define rep(i,a,n) for (int i=a;i<n;i++)
#define repp(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define CLR(a,b) memset(a,(b),sizeof(a))
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ls o<<1
#define rs o<<1|1


typedef long long ll;
typedef vector<int> VI;
const int MAXN = (int)2e5+10;
const int INF = 0x3f3f3f3f;
const int mod = (int)1e9+7;

void F() {
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
}

vector<int>E[MAXN];
int cnt[MAXN];
int n,k; 
int ans;
void dfs(int u,int fa) {
    cnt[u]=1;
    rep(i,0,SZ(E[u])){
        int v=E[u][i]; 
        if(v==fa) continue;
        dfs(v,u);
        cnt[u]+=cnt[v];
        if(cnt[v]>=k&&n-cnt[v]>=k) ans++;
    }
} 

int main(int argc, char const *argv[])
{
    cpp_io(); F();
    int T; cin>>T;
    while(T--){
        CLR(cnt,0);
        cin>>n>>k;
        rep(i,1,n){
            int u,v;
            cin>>u>>v;
            E[u].pb(v); E[v].pb(u);
        }
        ans=0;
        dfs(1,0);
        cout<<ans<<endl;
        repp(i,1,n) E[i].clear();
    }
    return 0;
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值