2017ACM/ICPC沈阳 L - Tree HDU - 6228 DFS思维题

博客目录

原题

题目传送门

Consider a un-rooted tree T which is not the biological significance of tree or plant, but a tree as an undirected graph in graph theory with n nodes, labelled from 1 to n. If you cannot understand the concept of a tree here, please omit this problem. 
Now we decide to colour its nodes with k distinct colours, labelled from 1 to k. Then for each colour i = 1, 2, · · · , k, define Ei as the minimum subset of edges connecting all nodes coloured by i. If there is no node of the tree coloured by a specified colour i, Ei will be empty. 
Try to decide a colour scheme to maximize the size of E1 ∩ E2 · · · ∩ Ek, and output its size.

Input

The first line of input contains an integer T (1 ≤ T ≤ 1000), indicating the total number of test cases. 
For each case, the first line contains two positive integers n which is the size of the tree and k (k ≤ 500) which is the number of colours. Each of the following n - 1 lines contains two integers x and y describing an edge between them. We are sure that the given graph is a tree. 
The summation of n in input is smaller than or equal to 200000. 

Output

For each test case, output the maximum size of E1 ∩ E1 ... ∩ Ek.

Sample Input

3
4 2
1 2
2 3
3 4
4 2
1 2
1 3
1 4
6 3
1 2
2 3
3 4
3 5
6 2

Sample Output

1
0
1

解析

题目英文比较易懂就不说大意了。

思路是考虑每一条边,如果此边两侧的点数都大于k,则这个边就可以存在于并集中。遍历所有边计数即可。

扫描二维码关注公众号,回复: 3511708 查看本文章

AC代码

#include<bits/stdc++.h>
using namespace std;
int const maxn=200000+5;
int n,k;
#define register int reg
vector<int>mp[maxn];
int sum;
int dfs(int rt,int pre){
    int sz=mp[rt].size();
    int cnt=0;
    for(int i=0;i<sz;i++){
        int c=mp[rt][i]; 
        if(c!=pre){
            c=dfs(c,rt);
            cnt+=c;
            if(c>=k && n-c>=k){
                sum++; 
            }
        }
    }
    return cnt+1;
}
int main(){
    #ifndef ONLINE_JUDGE 
    freopen("r.txt","r",stdin);
    #endif 
    int T;
    scanf("%d",&T);
    int i;
    while(T--){
        sum=0;
        scanf("%d%d",&n,&k);
        for(i=1;i<=n;i++){
            mp[i].clear();
        }
        int a,b;
        for(i=1;i<n;i++){
            scanf("%d%d",&a,&b);
            mp[b].push_back(a);
            mp[a].push_back(b);
        }
        dfs(1,-1);
        printf("%d\n",sum);
    }//end of while 
}

 

猜你喜欢

转载自blog.csdn.net/GreyBtfly/article/details/82972000