zoukankan      html  css  js  c++  java
  • hdu6228Tree

    Problem Description
    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
     
    中文题意:给你一个数T,代表case的个数;
    然后每个case,给两个数node(点的个数),k(颜色的个数),接下来node-1行,每行两个数,代表这两个数之间存在edge;
    然后保证每次case都是一棵树,现在用这k种颜色为树的节点进行染色,Ei代表第i种颜色的所有节点之间相连的所有边的集合;
    E[1],E[2],E[3]...E[node]中公共边数为最大数量;
     
    感想:第一次做这道题时,有点懵,想了一阵之后,脑海中有一点思路,既然是要求边,那就从边进行研究,可是脑海中的那一点灵光总是转不住,然后就在网上搜了题解,结果题解跟自己的那点灵光很像,但还是有一点地方有点疑惑;最后的AC代码还是在询问队友之后了解到了一些知识点采写出,总的来说我还是太菜了!!!需要努力!
     
    思路:对于某一个结点来说,如果它的左边(算上自身)能有k个结点的话,而它的右边也能有k个节点的话,那么这个结点右边的这条边就会在所有的边集中。
     
    AC代码:

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    using namespace std;
    const int maxn=200010;
    vector<int >ve[maxn];
    int plug[maxn];
    int sum[maxn];
    int number(int x){ //对于这里额使用的是一个数组来标记这个点是否访问过,其实也可以直接将上一个访问的点放进来进行判断就好,因为这个图也是一棵树
    for(int i=0;i<ve[x].size();i++){
    if(plug[ve[x][i]]) continue;
    plug[ve[x][i]]=1;
    sum[x]+=number(ve[x][i]);
    }
    return sum[x];
    }
    int main(){
    int T,node,k,x,y;
    cin>>T;
    while(T--){
    scanf("%d%d",&node,&k);
    for(int i=0;i<=maxn+5;i++) ve[i].clear();
    memset(plug,0,sizeof(plug));
    for(int i=0;i<=node;i++) sum[i]=1;
    for(int i=0;i<node-1;i++){
    scanf("%d%d",&x,&y);
    ve[x].push_back(y);
    ve[y].push_back(x);
    }
    plug[1]=1;
    number(1);
    /*for(int i=1;i<node;i++) printf("%d ",sum[i]);
    printf("%d ",sum[node]);*/
    int ans=0;
    for(int i=1;i<=node;i++){
    if(sum[i]>=k&&node-sum[i]>=k) ans++;
    }
    printf("%d ",ans);
    }
    }


    作者:孙建钊
    出处:http://www.cnblogs.com/sunjianzhao/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Django添加数据、查询数据(转载)
    Django添加数据、查询数据(转载)
    Django-用户权限,用户角色使用指南(转载)
    Django-用户权限,用户角色使用指南(转载)
    DJANGO复制记录的方法(转载)
    django 使用框架下auth.models自带的User进行扩展增加字段(转载)
    Django 怎样控制某个按钮的显示权限 (转载)
    IOS 内付 asp.net mvc 服务器端验证
    【问题】抓取微信公众号文章 特殊字符(&#65279;)问题
    Unable to Connect: sPort: 0 C# ServiceStack.Redis 访问 redis
  • 原文地址:https://www.cnblogs.com/sunjianzhao/p/11723440.html
Copyright © 2011-2022 走看看