zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    linux性能查看调优
    免密登录
    nginx配置
    Samba
    硬RAID与软RAID的区别
    LVM-扩容目录
    解决表面磁盘满,而实际没有大文件的问题
    LINUX下的JENKINS+TOMCAT+MAVEN+GIT+SHELL环境的搭建使用(JENKINS自动化部署)
    Docker 容器使用
    docker基础
  • 原文地址:https://www.cnblogs.com/sbfhy/p/7814668.html
Copyright © 2011-2022 走看看