ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

hdu6228Tree

2019-10-23 12:57:25  阅读:211  来源: 互联网

标签:node plug ve int tree sum 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\n",sum[node]);*/
int ans=0;
for(int i=1;i<=node;i++){
if(sum[i]>=k&&node-sum[i]>=k) ans++;
}
printf("%d\n",ans);
}
}

标签:node,plug,ve,int,tree,sum,hdu6228Tree
来源: https://www.cnblogs.com/sunjianzhao/p/11723440.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有