题目大意
机房有一个网络,某些机器的网络是互通的。(是一个树形结构)找一机器使得:距离它最远的机器的距离 最小。
Input
第1行:一个整数n。
第2~ n行:两个整数u、v,即u、v两台机器间有一条网线连接。机器从1~ n编号。
输入数据保证是一个连通的树型结构。
Output
1行一个整数,即最短的时间。
思路
求出树的直径,然后(ans+1)/2得出结果。
- 树的直径求法:任意一个点,DFS找到离它最远的点。然后以新找出的点为起点,找到离它最远的点,路径长度即树的直径。
(初二学长就是这么教的)
90分。。。
然后还要再加一个玄学的开栈???
int size = 256 << 20;
char*p=(char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p) );
(完全是从lyf大佬那kao来的)
100分Code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ans,ansd,n,aa,c[100001],L[100001],t=0;
struct aduflh{ //邻接表
int next,y;
} a[200001];
bool b[100001];
void s(int k,int d){
if(d>ans){
ans=d;
ansd=k;
}
b[k]=true; //标记
for(int i=L[k];i;i=a[i].next) //链接的边
if(b[a[i].y]==false) //没标记
s(a[i].y,d+1); //搜
}
int main(){
int size = 256 << 20;
char*p=(char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p) );//开栈
scanf("%d",&n);
for(int i=1;i<n;++i){
int xx,yy;
scanf("%d%d",&xx,&yy);
a[++t].y=yy;a[t].next=L[xx];L[xx]=t; //邻接表
a[++t].y=xx;a[t].next=L[yy];L[yy]=t;
}
s(1,0); //以1点开始
ans=0;
memset(b,0,sizeof(b)); //重新清0
s(ansd,0); //以找到的点开始
if(ans%2==1) printf("%d",ans/2+1);
else printf("%d",ans/2);
}