zoukankan      html  css  js  c++  java
  • [HDU6288]Tree

    题目

    题解

    首先读题就很成问题。。。。英语咋办呐!!!
    直接考虑有点复杂,直接分析每一条边能否被选入最终答案。对于这条边,看看他的(size[v])(n-size[v]) 是否都大于等于K就行,如果可以的话,那就能通过神奇的选点方式构造出题目所谓的各种染色方案。
    代码非常简单

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<queue>
    using namespace std;
    #define mem(a,b) memset(a,b,sizeof(a))
    typedef long long LL;
    typedef pair<int,int> PII;
    inline int read()
    {
       int x=0,f=1;char c=getchar();
       while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
       while(isdigit(c)){x=x*10+c-'0';c=getchar();}
       return x*f;
    }
    const int maxn=200010; 
    struct Edge
    {
       int u,v,next;
       Edge() {}
       Edge(int _1,int _2,int _3):u(_1),v(_2),next(_3) {}
    }e[maxn];
    int n,T,ce,K,a,b,first[maxn],size[maxn],cnt;
    void addEdge(int a,int b)
    {
       e[++ce]=Edge(a,b,first[a]);first[a]=ce;
       e[++ce]=Edge(b,a,first[b]);first[b]=ce;
    } 
    void dfs(int now,int fa)
    {
       size[now]=1;
       for(int i=first[now];i!=-1;i=e[i].next)
       	if(e[i].v!=fa)
       	{
       		dfs(e[i].v,now);
       		size[now]+=size[e[i].v];
       		if(size[e[i].v]>=K && n-size[e[i].v]>=K)cnt++;
       	}
    }
    int main()
    {
       T=read();
       while(T--)
       {
       	mem(first,-1);mem(size,0);ce=-1;cnt=0;
       	n=read();K=read();
       	for(int i=1;i<n;i++)a=read(),b=read(),addEdge(a,b);
       	dfs(1,-1);
       	printf("%d
    ",cnt);
       }
       return 0;
    }
    
  • 相关阅读:
    hadoop yarn
    java 删除文件夹及其里面的文件
    scrapy 429 处理
    java 获取当前时间(年月日时分秒)
    Java测试类
    eclipse环境问题-java版本不兼容
    Java内功修炼系列一工厂模式
    Java内功修炼系列一观察者模式
    Java内功修炼系列一责任链模式
    Java内功修炼系列一拦截器
  • 原文地址:https://www.cnblogs.com/FYH-SSGSS/p/12075141.html
Copyright © 2011-2022 走看看