社区讨论

抱灵求助

P3884[JLOI2009] 二叉树问题参与者 14已保存回复 27

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
27 条
当前快照
1 份
快照标识符
@locp6tqp
此快照首次捕获于
2023/10/30 17:28
2 年前
此快照最后确认于
2023/11/05 04:21
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
bool vis[10001];
inline int read()
{
    char c=getchar();int x=0;bool f=0;
    for(;!isdigit(c);c=getchar())f^=!(c^45);
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    if(f)x=-x;return x;
}
int d[1001],deep[1001],cs[10001];
int f[1001][31];
vector<int> G[101];int n,u,v;
void dfs(int u)
{
    d[u]=d[f[u][0]]+1;
    deep[u]=d[u];
    for(int i=0;i<G[u].size();i++)
	{
        int v=G[u][i];
        if(v==f[u][0])
		{
            continue;
        }
        f[v][0]=u;
        dfs(v);
    }
}
inline int lca(int x,int y)
{
    if(d[x]<d[y])
    {
        swap(x,y);
    }
    int K=0;
    while((1<<(K+1))<=d[x])//最多走k次
    {
        K++;
    }
    for(int j=K;j>=0;j--)
    {
        if(d[f[x][j]]>=d[y])
        {
            x=f[x][j];
        }
    }
    if(x==y)
    {
        return x;
    }
    for(int j=K;j>=0;j--)
    {
        if(f[x][j]!=f[y][j])
        {
            x=f[x][j];
            y=f[y][j];
        }
    }
    return f[x][0];
}
int main()
{
	n=read();
	for(int i=1;i<=n-1;i++)
	{
		u=read(),v=read();
		G[u].push_back(v);
		G[v].push_back(u);
	}
	cin>>u>>v;
	dfs(1);
	for(int j=1;(1<<j)<=n;j++)
    {
        for(int i=1;i<=n;i++)
        {
            f[i][j]=f[f[i][j-1]][j-1];
        }
    }
    int maxdep=0,maxx=0;
	for(int i=1;i<=n;i++)
	{
		maxdep=max(maxdep,d[i]);
	}
	for(int i=1;i<=n;i++)
	{
		cs[deep[i]]++;
	}
	for(int i=1;i<=n;i++) maxx=max(maxx,cs[i]);
	int b=lca(u,v);
	cout<<maxx<<"\n"<<maxdep<<"\n"<<(d[u]-d[b])*2+(d[v]-d[b])<<"\n";
}

回复

27 条回复,欢迎继续交流。

正在加载回复...