2419. Grass Planting

2419. Grass Planting

题目描述

到了一年中Farmer John在他的草地里种草的时间了。整个农场由N块草地组成(1≤N≤10^5),方便起见编号为1…N,由N−1条双向的小路连接,每块草地都可以经过一些小路到达其他所有的草地。
Farmer John当然可以在每块草地里种不同种类的草,但是他想要使得使用的草的种类数最小,因为他用的草的种类数越多,他就需要负担更高的花费。
不幸的是,他的奶牛们对选择农场上的草表现得十分苛刻。如果两块相邻(由一条小路直接相连)的草地种了同一种草,或者即使是两块接近相邻(均可由一条小路直接连向同一块草地)的草地,那么奶牛们就会抱怨她们进餐的选择不够多样。Farmer John能做的只能是抱怨这些奶牛,因为他知道她们不能被满足的时候会制造多大的麻烦。
请帮助Farmer John求出他的整个农场所需要的最少的草的种类数。

输入

输入的第一行包含N。以下N−1行每行描述了一条小路连接的两块草地。

输出

输出Farmer John需要使用的最少的草的种类数。

样例输入

4
1 2
4 3
2 3

样例输出

3

数据范围限制

提示
在这个简单的例子中,4块草地以一条直线的形式相连。最少需要三种草。例如,Farmer John可以用草A,B和C将草地按A - B - C - A的方式播种。

这是一道逻辑推理题
设f[i]表示第i块草地所连接的草地数量。(桶排)
思路:
根据题意,我们知道第i块及它相连的草地最小需要f[i]+1种草。所以,我们求出max(f[i]),那么再+1就是正解。为什么呢?
因为f[i]最大,所以f[j]一定<=f[i],换句话说,第i块及相连的草地只用了f[i]+1种草就欧了,那f[j]又没f[i]牛(f[j]没有f[i]连得草地多),题目又没有规定f[i]及它兄弟用过的草的种类不给f[j]及它兄弟用,所以可推出,f[j]可以在f[i]使用的草中,挑选一些自用,就行了!
如下图,f[2]就是那个最牛的仔。
在这里插入图片描述

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e5+10;
int f[N],n,x,y,maxn=-123;
void input()
{
	scanf("%d",&n);
	for(int i=1;i<n;i++) 
	{
		scanf("%d%d",&x,&y);
		f[x]++,f[y]++;
		maxn=max(maxn,max(f[x],f[y])+1);
	}
}
int main()
{
	fre(planting);
	input();
	printf("%d",maxn);
	return 0;
}
发布了130 篇原创文章 · 获赞 93 · 访问量 6795

猜你喜欢

转载自blog.csdn.net/bigwinner888/article/details/105565905
今日推荐