28分求助!
查看原帖
28分求助!
1076440
Kano_zyc楼主2023/11/30 19:08

rt,蒟蒻一只,代码求条

#include<bits/stdc++.h>
using namespace std;
const int N=1e2+1;
int n,u,v,x,y;
int l,ans1[N];
int ans;
int f[N],b[N],pos[N];
int idx;
int minn=INT_MAX;
bool g[N][N],vis[N];
struct Kano{
	int l,r,deep;
}a[N];
void dfs(int rt,int de)
{
	a[rt].deep=de;
	vis[rt]=1;
	ans1[de]++;
	l=max(l,ans1[de]);
	int pt=-1;
	for(int i=1;i<=n;i++)
	{
		if(vis[i])
		{
			continue;
		}
		else if(g[rt][i])
		{
			if(a[rt].l==0)
			{
				a[rt].l=i;
				dfs(i,de+1);
			}
			else
			{
				a[rt].r=i;
				dfs(i,de+1);
			}
		}
	}
	ans=max(ans,de);
}
void dfs1(int i,int de)
{
	idx++;
	pos[i]=idx;
	f[idx]=i;
	b[idx]=de;
	if(a[i].r)
	{
		dfs1(a[i].r,de+1);
		f[++idx]=i;
		b[idx]=de;
	}
	if(a[i].l)
	{
		dfs1(a[i].l,de+1);
		f[++idx]=i;
		b[idx]=de;
	}
}
int find(int x,int y)
{
	int minn=x;
	for(int i=x+1;i<=y;i++)
	{
		if(b[i]<b[minn])minn=i;
	}
	
	return f[minn];
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		g[u][v]=true;
		g[v][u]=true;
	}
	scanf("%d %d",&x,&y);
	if(x>y)swap(x,y);
	dfs(1,1);
	dfs1(1,1);
	printf("%d\n%d\n",ans,l);
	int lca=find(pos[x],pos[y]);
	int ans1;
	if(a[x].deep<a[y].deep)ans1=(abs(a[x].deep-lca))+abs(a[y].deep-lca)*2;
	else ans1=(abs(a[x].deep-lca))*2+abs(a[y].deep-lca);
	printf("%d",ans1);
	return 0;
}
2023/11/30 19:08
加载中...