牛客练习赛24 -B凤 凰

题目链接: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;
	}
}

猜你喜欢

转载自blog.csdn.net/King8611/article/details/81582685