HDU6228 Tree

本题是一个思维题,我们想到,如果一个边左右两侧的点都超过k个,那么他就可以用交集,不然的话就没有交集,因为会有一遍没法k个

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#include<string>
#include<cstring>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int inf=0x3f3f3f3f;
vector<int> m[N];
int s[N];
void dfs(int u,int fa){
    int i;
    s[u]=1;
    for(i=0;i<m[u].size();i++){
        if(m[u][i]==fa)
        continue;
        dfs(m[u][i],u);
        s[u]+=s[m[u][i]];
    }
}
int main(){
    int t;
    int n,k;
    cin>>t;
    while(t--){
        cin>>n>>k;
        memset(s,0,sizeof s);
        for(int i=1;i<=n;i++)
        m[i].clear();
        for(int i=0;i<n-1;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            m[u].push_back(v);
            m[v].push_back(u);
        }
        dfs(1,-1);
        int ans=0;
        for(int i=1;i<=n;i++){
            if(s[i]>=k&&n-s[i]>=k)
            ans++;
        }
        printf("%d
",ans);
    } 
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/12325338.html