2*【DFS】+【树】机器选择

题目大意

机房有一个网络,某些机器的网络是互通的。(是一个树形结构)找一机器使得:距离它最远的机器的距离 最小。

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);
}

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/88555028
今日推荐