社区讨论
0pts 满江红求调
P1395会议参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mjcz8fqb
- 此快照首次捕获于
- 2025/12/19 22:40 2 个月前
- 此快照最后确认于
- 2025/12/21 16:40 2 个月前
CPP
//998244353
#include<bits/stdc++.h>
#define itn int
using namespace std;
const int N=1e5+10;
vector<int> e[N];
int sz[N],n,a,b,sum=0,dp[N];//ans记录删除重心后,剩余连通块中点数的最大值
priority_queue<int,vector<int>,greater<int>> ans;
inline void dfs1(int u,int fa) // u的父亲是fa
{
sz[u]=1; // 初始化sz[u]
int mx=0; // 初始化mx
for(int v:e[u]) // 遍历u的儿子v
{
if(v==fa)
{
continue;
}
dfs1(v,u); // 递归
sz[u]+=sz[v]; // u的子树大小加上v的子树大小
mx=max(mx, sz[v]); // 此时mx记录u的所有儿子中最大子树的大小
}
mx=max(mx,n-sz[u]); // 更新mx,n-sz[u]为以u为根的子树上面的部分
int ls=min(ans.top(),mx);
ans.push(ls); // 更新ans
}
inline void dfs2(int u,int fa)
{
for(auto ls:e[u])
{
if(ls==fa)
{
continue;
}
dp[ls]=dp[u]+1;
dfs2(ls,u);
}
}
int main()
{
ans.push(1e9);
scanf("%d",&n);
for (int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
e[a].push_back(b);
e[b].push_back(a);
}
dfs1(1,0);
dp[ans.top()]=0;
dfs2(ans.top(),0);
for(int i=1;i<=n;i++)
{
if(i!=ans.top())
{
sum+=dp[i];
}
}
printf("%d %d",ans.top(),sum);
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...