链接:https://www.nowcoder.com/acm/contest/136/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
桃花一簇开无主,可爱深红映浅红。
——《题百叶桃花》
桃花长在桃树上,树的每个节点有一个桃花,调皮的HtBest想摘尽可能多的桃花。HtBest有一个魔法棒,摘到树上任意一条链上的所有桃花,由于HtBest法力有限,只能使用一次魔法棒,请求出Htbest最多可以摘到多少个桃花。
输入描述:
第一行有一个正整数n,表示桃树的节点个数。 接下来n-1行,第i行两个正整数ai,bi ,表示桃树上的节点ai,bi之间有一条边。
输出描述:
第一行一个整数,表示HtBest使用一次魔法棒最多可以摘到多少桃花。
输入
3 1 2 2 3 3 1 2 1 3 4 1 2 2 3 3 4
输出
复制
3 3 4
此题题意为求树的直径(开始还以为是求最大的森林包含的节点个数,用的并查集WA了)两遍 dfs 即可,首先我们随意选择一点,通过 dfs 找到离改点最远的一个节点,记为 e ,此时 e 应为直径的一端(画图可以理解一下,注意是随意选择一点哦),然后再以 e 为起点进行深搜,找到离 e 最远的点的距离,输出这个距离就好了(树的直径)
Em......对了,牛客的测评姬可能不太稳定,,,我第一次提交 TLE 通过数据%75,第二次就AC了,,,
#include <cstdio>
#include <cstring>
#include <vector>
#define MAXN 1000010
#define max(x,y) x>y?x:y
using namespace std;
bool f[MAXN];
int mx,n,cnt,e;
vector<int> v[MAXN];
void read(int &x) {
char ch = getchar();
x = 0;
for( ; ch < '0' || ch > '9' ; ch = getchar() );
for( ; ch >='0' && ch <= '9'; ch = getchar() )
x = x * 10 + ch - '0';
}
void dfs( int pos , int step ) {
f[pos] = true;
if( mx<step ) {
mx = step;
e = pos;
}
for( int i=0 ; i<v[pos].size() ; i++ ) {
if( !f[ v[pos][i] ] )
dfs( v[pos][i] , step+1 );
}
}
int main() {
// freopen( "in.txt","r",stdin );
int s;
while( ~scanf( "%d",&n ) ) {
memset( f,false,sizeof(f) );
for( int i=1 ; i<n ; i++ ) {
read( s );
read( e );
v[s].push_back(e);
v[e].push_back(s);
}
mx = -1;
dfs( 1,0 );
memset( f,false,sizeof(f) );
mx = -1;
dfs( e,1 );
printf( "%d\n",mx );
for( int i=1 ; i<n ; i++ )
v[i].clear();
}
}

571

被折叠的 条评论
为什么被折叠?



