求助
查看原帖
求助
114768
7k1danWhen楼主2020/5/13 19:39

1、使用邻节表 2、求树的直径那段是dfs(相信这段是对的),看不懂勿喷 3、求大佬看看哪里错了

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;

#define N 100010
struct tree
{
	int x,y;
}q[N*2];
int n,m,k,b[N],e[N];
int f[N],s[N],id_f[N],id_s[N],p[N],top=1,deep[N]={},maxdeep[N]={},ans[N],sum=0;
bool cmp2(int A,int B){return A>B;}

bool cmp(tree u,tree v)
{
	if(u.x==v.x) return u.y<v.y;
	return u.x<v.x;
}

int dfs(int u,int fa)
{
	f[u]=s[u]=0;
	if(b[u]==e[u]) return u;
	for(int i=b[u];i<=e[u];i++)
	{
		int next=q[i].y;
		if(next!=fa)
		{
			int tmp=dfs(next,u);
			if(f[u]<f[next]+1)
			{
				s[u]=f[u];
				f[u]=f[next]+1;
				id_s[u]=id_f[u];
				id_f[u]=tmp;
			}
			else if(s[u]<f[next]+1)
			{
				s[u]=f[next]+1;
				id_s[u]=tmp;
			}
		}
	}
	return id_f[u];
}

bool find(int u,int fa)
{
	if(u==id_s[1]) return 1;
	for(int i=b[u];i<=e[u];i++)
	{
		int next=q[i].y;
		if(next!=fa)
		{
			p[++top]=next;
			if(find(next,u)==0) top--;
			else return 1;
		}
	}
	return 0;
}

void D(int u,int fa)
{
	maxdeep[u]=deep[u];
	for(int i=b[u];i<=e[u];i++)
	{
		int next=q[i].y;
		if(next!=fa)
		{
			deep[next]=deep[u]+1;
			D(next,u);
			if(maxdeep[next]>maxdeep[u]) maxdeep[u]=maxdeep[next];
		}
	}
}

int main()
{
	scanf("%d%d",&n,&k);
	int m=(n-1)*2;
	for(int i=1;i<=m;i+=2)
	{
		scanf("%d%d",&q[i].x,&q[i].y);
		q[i+1].x=q[i].y,q[i+1].y=q[i].x;
	}
	sort(q+1,q+m+1,cmp);
	memset(b,-1,sizeof(b));
	memset(e,-1,sizeof(e));
	for(int i=1;i<=m;i++)
	{
		int x=q[i].x;
		if(b[x]==-1) b[x]=i;
		e[x]=i;
	}
	dfs(1,-1); //choose 1 as root
	find(id_f[1],-1);
	int t=p[(top+1)/2];
	D(t,-1);
	for(int i=1;i<=n;i++) ans[i]=maxdeep[i]-deep[i];
	sort(ans+1,ans+n+1,cmp2);
	for(int i=k+1;i<=n;i++) if(ans[i]+1>sum) sum=ans[i]+1;
	printf("%d\n",sum);
	return 0;
}
2020/5/13 19:39
加载中...