hdu 6228 Tree

hdu 6228

题意:一棵 n 个点的树,要你把这些树上的节点用 k 种颜色染色,问你在最优的染色方案下,相同颜色点连接的最小边集的交集最大是多少

Tags: dfs,  貌似读懂题就好做了。。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a; i<=b; ++i)
#define per(i,b,a) for (int i=b; i>=a; --i)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi  first
#define se  second
typedef long long ll;
const int N = 200005;

int T, n, k, head[N], tot, ans, Size[N];
struct Edge{int to, next; } e[N<<2];
void Addedge(int u, int v)
{
    e[tot]=(Edge){ v, head[u] };  head[u]=tot++;
    e[tot]=(Edge){ u, head[v] };  head[v]=tot++;
}
void dfs(int u, int fa)
{
    ++Size[u];
    for(int i=head[u], to; to=e[i].to, ~i; i=e[i].next)
        if(to!=fa)
    {
        dfs(to, u);
        Size[u] += Size[to];
        if(Size[to]>=k && (n-Size[to])>=k)
            ++ans;
    }
}
int main()
{
    scanf("%d", &T);
    while(T--)
    {
        mes(head, -1);   tot=ans=0;
        mes(Size, 0);
        scanf("%d%d", &n, &k);
        int u, v;
        rep(i,1,n-1)
        {
            scanf("%d%d", &u, &v);
            Addedge(u, v);
        }
        dfs(1,0);
        printf("%d
", ans);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/sbfhy/p/7814668.html