列表

详情


NC24200. [USACO 2019 Jan S]Grass Planting

描述

到了一年中Farmer John在他的草地里种草的时间了。整个农场由N块草地组成(1≤N≤10^5),方便起见编号为1…N,由N−1条双向的小路连接,每块草地都可以经过一些小路到达其他所有的草地。

Farmer John当然可以在每块草地里种不同种类的草,但是他想要使得使用的草的种类数最小,因为他用的草的种类数越多,他就需要负担更高的花费。

不幸的是,他的奶牛们对选择农场上的草表现得十分苛刻。如果两块相邻(由一条小路直接相连)的草地种了同一种草,或者即使是两块接近相邻(均可由一条小路直接连向同一块草地)的草地,那么奶牛们就会抱怨她们进餐的选择不够多样。Farmer John能做的只能是抱怨这些奶牛,因为他知道她们不能被满足的时候会制造多大的麻烦。

请帮助Farmer John求出他的整个农场所需要的最少的草的种类数。

输入描述

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

输出描述

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

示例1

输入:

4
1 2
4 3
2 3

输出:

3

说明:

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang 3.9) 解法, 执行用时: 23ms, 内存消耗: 756K, 提交时间: 2020-09-06 16:40:34

#include<stdio.h>
int main(){
	int n,a,b;
	int ans=0;
	int x[100005]={0};
	scanf("%d",&n);
	n=n-1;
	while(n--){
		scanf("%d%d",&a,&b);
		x[a]++;
		x[b]++;
		if(x[a]>ans)ans=x[a];
		if(x[b]>ans)ans=x[b];
	}
	ans=ans+1;
	printf("%d",ans);
	return 0;
} 

C++14(g++5.4) 解法, 执行用时: 39ms, 内存消耗: 1888K, 提交时间: 2019-06-24 23:19:31

#include<cstdio>
int x,y,ans,n,deg[100007];
int main() {
    scanf("%d",&n);
    for(int i=1;i<n;i++) {
        scanf("%d%d",&x,&y);
        if(++deg[x]>ans)ans=deg[x];
        if(++deg[y]>ans)ans=deg[y];
    }
    printf("%d",ans+1);
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 42ms, 内存消耗: 788K, 提交时间: 2020-02-26 23:45:52

#include<bits/stdc++.h>
using namespace std;
int a[100200];
int n,x,y,ans;
int main()
{
	cin>>n;
	while(~scanf("%d%d",&x,&y))
	{
		a[x]++;
		a[y]++;
	}
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,a[i]);
	}
	printf("%d\n",ans+1);
}

pypy3(pypy3.6.1) 解法, 执行用时: 280ms, 内存消耗: 24932K, 提交时间: 2020-09-05 21:48:38

def gt():
    return list(map(int, input().split()))
n ,= gt()
deg = [0 for i in range(n+1)]
for i in range(n-1):
    a,b = gt()
    deg[a] += 1
    deg[b] += 1
print(max(deg)+1)

上一题