题目描述
某计算机网络中存在 n 个路由,每个路由代表一个子网。路由之间有 n−1 条互通关系,使得这n 个网络之间任意两个网络都可以直接联通,或者通过其他网络间接连通。
为了测试组建的网路的性能,假设相邻的路由之间的数据传输需要一单位时间,现在需要知道任意两个路由之间传输数据最多需要多长时间。
输入描述
第一行一个整数(2≤n≤50000) 表示网络中路由个数。 接下来n−1 行,每行输入 u, v(1≤u,v≤n) ,表示路由u,v 相连。
输出描述
输出一行表示答案
样例输入
8
6 3
3 7
3 4
7 5
5 1
6 8
5 2
样例输出
5
思路
据说这是一个求树的直径的题。
可以先随便找一个点广搜找到最外层的点,然后从这个点第二次广搜找到树之间最远的距离。
AC代码
#include <iostream>
#include <string.h>
#include<cstdlib>
#include <queue>
using namespace std;
const int maxn = 10e4+1;
struct node{
int num,step;
}point[maxn];
struct edge{
int v,next;
}e[maxn];
int p[maxn],eid,maxp,maxs = 0;
bool vst[maxn];
void init(){
memset(p,-1, sizeof(p));
eid = 0;
}
void insert(int u,int v){
e[eid].v = v;
e[eid].next = p[u];
p[u] = eid++;
}
void bfs(node v){
queue<node>q;
q.push(v);
vst[v.num] = true;
while(!q.empty()){
struct node u = q.front();
q.pop();
for(int i = p[u.num];i!=-1;i = e[i].next){
if(!vst[e[i].v]){
vst[e[i].v] = true;
point[e[i].v].step = u.step+1;
point[e[i].v].num = e[i].v;
if(maxs<point[e[i].v].step){
maxp = e[i].v;
maxs = point[e[i].v].step;
}
q.push(point[e[i].v]);
}
}
}
}
int main(){
init();
int n,u,v;
cin>>n;
for(int i = 0;i<n-1;i++){
cin>>u>>v;
insert(u,v);
insert(v,u);
}
memset(point,0, sizeof(point));
memset(vst,false, sizeof(vst));
point[1].num = 1;
bfs(point[1]);
memset(point,0, sizeof(point));
memset(vst,false, sizeof(vst));
point[maxp].num = maxp;
bfs(point[maxp]);
cout<<maxs;
return 0;
}