题目链接:https://www.nowcoder.com/acm/contest/157/B
这道题就很有意思了,这道题正面下手我们不好考虑,所以不妨从反面下手。
1:我们假设现在有一棵n个节点的树,然后每秒从根节点过来一只鸟,那很明显,n秒后每个节点都会有一只鸟。
2:但是这道题好像并不是根节点每秒只有一只鸟,但是根节点的子节点是刚好每秒有一只鸟路过。
3:我们把根节点去掉,剩下几棵独立的树,求出每棵树的节点数,最大的树的节点数就是答案。
4:用并查集解决。
不过这道题需要用JAVA的缓冲输入:
import java.io.*;
import java.util.*;
public class Main {
static int f[]; //父节点
static int num[]; //节点的权,表示这个节点下面的所有子节点的个数
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
int n=getInt();
f=new int[n+1];
num=new int[n+1];
for(int i=0;i<=n;i++) {
f[i]=i;
num[i]=1;
}
for(int i=1;i<n;i++) {
int a=getInt();
int b=getInt();
if(a!=1&&b!=1)
link(a,b);
}
int max=0;
for(int i=2;i<=n;i++) {
max=Math.max(max,num[find(i)]);
//System.out.println(i+" "+max);
}
System.out.println(max);
}
static int getInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
static String getString() throws IOException {
in.nextToken();
return in.sval;
}
static int find(int x) {
if(x==f[x])return x;
int y=find(f[x]);
f[x]=y;
return y;
}
static void link(int x,int y) { //链接函数
int fx=find(x),fy=find(y);
num[fx]+=num[fy];
f[fy]=fx;
}
}