题目:https://vjudge.net/contest/307753#problem/D

题意:给你一棵树,让你求出一个点,让他的最大子树的节点数尽量小

思路:最大子树节点数尽量小,一看就是树的重心, 然后随便套个原来的点分治模板即可

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#define maxn 100005
#define mod 1e19
using namespace std;
typedef long long ll;
ll da;
vector<pair<ll,ll> > mp[maxn];//存下图
bool vis[maxn];//标记曾经使用过的重心
ll maxsize[maxn],dis[maxn],d[maxn];//maxsize 当前节点的最大子树
ll siz[maxn],e[maxn];// dis 到重心的距离 d 出现过的距离
ll n,m,rt,sum,qe; // siz 当前节点的子树个数 e 出现的距离 rt代表当前重心
void find(ll x,ll f){//找出重心
siz[x]=;
maxsize[x]=;
for(int i=;i<mp[x].size();i++){
pair<ll,ll> q=mp[x][i];
if(q.first==f||vis[q.first]) continue;//vis数组标记曾经使用过的重心
find(q.first,x);
siz[x]+=siz[q.first];
maxsize[x]=max(maxsize[x],siz[q.first]);
}
maxsize[x]=max(maxsize[x],sum-siz[x]);//节点总数减去当前的子树数=以当前节点为根的父亲点子树数
if(maxsize[x]<maxsize[rt]){
rt=x;
}
else if(maxsize[x]==maxsize[rt]&&rt>x){
rt=x;
}
}
void get_dis(ll x,ll f,ll len){
e[++qe]=len;
for(int i=;i<mp[x].size();i++){
pair<ll,ll> q=mp[x][i];
if(q.first==f||vis[q.first]) continue;
dis[q.first]=dis[x]+len;
get_dis(q.first,x,len+q.second);
}
}
ll solve(ll x,ll len){
ll ee=;
qe=;
dis[x]=len;
get_dis(x,,len);
sort(e+,e+qe+);
ll l=,r=qe;
while(l<r){
if(e[l]+e[r]<=m){
ee+=r-l;
l++;
}
else{
r--;
}
}
return ee;
}
void divide(ll x){
da+=solve(x,);
vis[x]=;
for(int i=;i<mp[x].size();i++){
pair<ll,ll> q=mp[x][i];
if(vis[q.first]) continue;
da-=solve(q.first,q.second);
sum=siz[q.first];
rt=;
maxsize[rt]=mod;
find(q.first,x);
divide(rt);
}
}
void init(){
da=;
for(int i=;i<=n;i++) mp[i].clear();
for(int i=;i<=n;i++) vis[i]=;
}
int main(){
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
ll a,b,c;
init();
for(int i=;i<n-;i++){
scanf("%lld%lld",&a,&b);
mp[a].push_back(make_pair(b,c));
mp[b].push_back(make_pair(a,c));
}
sum=n;//当前节点数
rt=;
maxsize[]=mod;//置初值
find(,);
//divide(rt);
printf("%lld %lld\n",rt,maxsize[rt]);
}
}

最新文章

  1. morse code
  2. BeanUtils.copyProperties() 用法
  3. mapreduce流程中的几个关键点
  4. 基于OWIN WebAPI 使用OAuth授权服务【客户端模式(Client Credentials Grant)】
  5. Fragement
  6. 如何通过ildasm/ilasm修改assembly的IL代码
  7. OpenJudge计算概论-校门外的树
  8. ionic 字体的导入方法
  9. apache FtpServer 整合spring部署
  10. C语言函数不定参数实现方式
  11. OpenCV角点检测源代码分析(Harris和ShiTomasi角点)
  12. php跨域问题记录
  13. 一文学会matplotlib
  14. 潭州课堂25班:Ph201805201 django 项目 第二十三课 文章主页 轮播图前端实现 热门新闻推荐实现 详情页实现 (课堂笔记)
  15. Reactor反应器模式 (epoll)
  16. 数据分析:基于Python的自定义文件格式转换系统
  17. 广播消费:允许一个 Group ID 所标识的所有 Consumer 都会各自消费某条消息一次。
  18. shell 脚本学习
  19. 【读书笔记】iOS-网络-运行循环
  20. VMware虚拟机配置

热门文章

  1. fiddler抓取火狐浏览器上https协议请求
  2. vue-安装及新建一个项目
  3. 【ABAP系列】SAP ABAP模块-取整操作中CEIL和FLOOR用法
  4. TensorFlow学习笔记1-入门
  5. mysql内存数据淘汰机制和大查询会不会把内存打爆?
  6. json字符串格式
  7. [LOJ3123] CTSC2019重复
  8. Java arraylist重复使用问题
  9. 浏览器如何减少 reflow/repaint
  10. 脚本_检测mysql存活状态