牛客练习赛24 -B凤 凰

30 篇文章 1 订阅

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值