- *树的直径是指树的最长简单路。求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径
链接:https://www.nowcoder.com/acm/contest/136/C
来源:牛客网
题目描述
桃花一簇开无主,可爱深红映浅红。
——《题百叶桃花》
桃花长在桃树上,树的每个节点有一个桃花,调皮的HtBest想摘尽可能多的桃花。HtBest有一个魔法棒,摘到树上任意一条链上的所有桃花,由于HtBest法力有限,只能使用一次魔法棒,请求出Htbest最多可以摘到多少个桃花。
输入描述:
第一行有一个正整数n,表示桃树的节点个数。 接下来n-1行,第i行两个正整数ai,bi ,表示桃树上的节点ai,bi之间有一条边。
输出描述:
第一行一个整数,表示HtBest使用一次魔法棒最多可以摘到多少桃花。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<set>
#include<vector>
#include<sstream>
#include<queue>
#define ll long long
#define PI 3.1415926535897932384626
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e6+10;
struct Edge
{
int to,next;
int flag;
}edge[maxn];
int tot;
int head[maxn];
int maxs;
int vis[maxn];
template <class T>
struct node
{
int v,setp;
};
void init()
{
tot=1;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
int bfs(int x)
{
memset(vis,0,sizeof(vis));
node start,next;
queue<node>q;
start.v=x;
start.setp=1;
q.push(start);
int t;
while(!q.empty())
{
start=q.front();
q.pop();
for(int i=head[start.v];i!=-1;i=edge[i].next)
{
if(!vis[edge[i].to]){
next.v=edge[i].to;
next.setp=start.setp+1;
q.push(next);
vis[next.v]=1;
if(next.setp>maxs)
{
maxs=next.setp;
t=next.v;
}
}
}
}
return t;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=1;i<=n-1;i++)
{
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
maxs=0;
int point=bfs(bfs(1));
printf("%d\n",maxs);
}
return 0;
}