题解链接

大意是我们求出直径的中心 那么到最远点必然经过中心
把它提到根
就可以在枚举删的白点时很快统计出能够使多少个黑点不高兴

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;inline char nc(){static char buf[100000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int &x){char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}const int N=100005;struct edge{int u,v,w,next;
}G[N<<1];
int head[N],inum;
inline void add(int u,int v,int w,int p){G[p].u=u; G[p].v=v; G[p].w=w; G[p].next=head[u]; head[u]=p;
}
#define V G[p].vint bla[N];
int dis[N],dis2[N];
int pt,maxd;inline void find(int u,int fa){if (bla[u] && dis[u]>maxd) maxd=dis[u],pt=u;for (int p=head[u];p;p=G[p].next)if (V!=fa)dis[V]=dis[u]+G[p].w,find(V,u);
}int size[N];
int cur,rt[N];
int f[N],g[N];inline void dfs(int u,int fa){rt[u]=cur;size[u]=bla[u];for (int p=head[u];p;p=G[p].next)if (V!=fa)dis[V]=dis[u]+G[p].w,dfs(V,u),size[u]+=size[V];if (bla[u]) f[u]=dis[u],g[u]=1;for (int p=head[u];p;p=G[p].next)if (V!=fa){if (f[V]>f[u])f[u]=f[V],g[u]=g[V];else if (f[V]==f[u])g[u]+=g[V];}
}int n,m,RT;int main(){int x,y,iu,iv,iw;freopen("t.in","r",stdin);freopen("t.out","w",stdout);read(n); read(m); y=m;while (y--) read(x),bla[x]=1;for (int i=1;i<n;i++)read(iu),read(iv),read(iw),add(iu,iv,iw,++inum),add(iv,iu,iw,++inum);maxd=0; find(1,0);for (int i=1;i<=n;i++) dis[i]=0;x=pt; maxd=0; find(pt,0);for (int i=1;i<=n;i++) dis2[i]=dis[i],dis[i]=0;;maxd=0; find(pt,0);RT=0;for (int i=1;i<=n;i++)if(dis[i]+dis2[i]==dis[x])if(!RT || abs(dis[i]-dis2[i])<abs(dis[RT]-dis2[RT]))RT=i;dis[RT]=0,size[RT]=bla[RT];for (int p=head[RT];p;p=G[p].next)dis[V]=G[p].w,cur=V,dfs(V,RT),size[RT]+=size[V];int mx1=0,mx2=0,id1=0,id2=0;for(int p=head[RT];p && ~id1 && ~id2;p=G[p].next){if (!size[V]) continue;if (f[V]>mx1)mx2=mx1,id2=id1,mx1=f[V],id1=V;else if(f[V]==mx1)mx1==mx2?id1=id2=-1:(mx2=f[V],id2=V);else if(f[V]>mx2)mx2=f[V],id2=V;}int ans=0,tot=0;if (!bla[RT]) ans=m,tot=1;for (int i=1;i<=n;i++){if (i==RT || bla[i]) continue;int ret=size[i];if (~id1 && ~id2 && size[i] && f[i]==f[rt[i]] && g[i]==g[rt[i]]){if (rt[i]==id1)f[id1]>f[id2]?ret+=m-size[id1]:ret+=size[id2];else if (rt[i]==id2)ret+=size[id1];}if (ret>ans)ans=ret,tot=1;else if(ret==ans)tot++;}printf("%d %d\n",ans,tot);return 0;
}

[树的直径 树形DP] UOJ #11【UTR #1】ydc的大树相关推荐

  1. POJ 1655 Balancing Act[树的重心/树形dp]

    Balancing Act 时限:1000ms Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered ...

  2. 最大搜索二叉子树大小(树形dp)

    给定一颗二叉树的头节点head,返回这棵二叉树中最大的二叉搜索子树 (二叉搜索树:该二叉树中左子树所有节点比它小,右子树所有节点比它大 ): 思路: 这是一道分析可能性求解在二叉树上做类似动态规划的问 ...

  3. bzoj3124 [Sdoi2013]直径 直径+树形dp

    这个题标签为什么会有网络流.. 首先树的直径求法就是两遍dfs 然后以其中一个为树的根,统计子树到节点的最长距离与次长距离: 符合条件的点一定是最长距离唯一的,且次长距离与到根的距离不相等 注: 1. ...

  4. AcWing1073.树的中心(树形DP)题解

    题目传送门 题目描述 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值. 请你在树中找到一个点,使得该点到树中其他结点的最远距离最近. 输入格式 第一行包含整数 ...

  5. bzoj 3162: 独钓寒江雪 树哈希+树形dp

    题意 给出一棵无标号无根树,问本质不同的最大独立集数量.答案模1e9+7. n<=500000 分析 对于一般的情况,我们可以先找出树的重心作为根,然后进行树形dp.这样做有什么好处呢?通过根的 ...

  6. M - Kill the tree 计蒜客 - 42552(2019icpc徐州/树的重心/树形dp)

    vj地址 题目大意:找到每一颗子树的重心 思路: 树的重心的性质: 树的重心如果不唯一,则至多有两个,且这两个重心相邻 通过连接一条端点分别在两个树的边,来将两个树合并成一个,那么新的重心肯定是在原来 ...

  7. LeetCode 663. 均匀树划分(树形DP)

    文章目录 1. 题目 2. 解题 1. 题目 给定一棵有 n 个结点的二叉树,你的任务是检查是否可以通过去掉树上的一条边将树分成两棵,且这两棵树结点之和相等. 样例 1: 输入: 5/ \10 10/ ...

  8. POJ 1655 求树的重心(树形dp)

    题目链接 树的重心: 若树上的一个节点满足其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心. 1.任选一个点为根,只要统计出每个点的子树大小,就能很快求出每个点子树节点的数量的最大值. ...

  9. P7103 「C.E.L.U-01」族谱树 (dfs 树形dp

    添加链接描述 #include<bits/stdc++.h> using namespace std; const int N=5e6+9; int e[N],ne[N],h[N],idx ...

最新文章

  1. C/C++ 指针函数 与 函数指针
  2. Mogees将手势识别技术运用于新产品
  3. Protoc Buffer 优化传输大小的一个细节
  4. python语言编程入门先学什么-自学编程入门,先学什么语言好?
  5. 超多树形结构的JavaScript菜单实例
  6. 服务部署如何做到高可用?这份“三级跳”秘籍送给你
  7. Java中浮点数的基础知识
  8. java自定义注解解析及自定义注解
  9. 【枭·音频】注入灵魂—《暗影火炬城》角色语音后期处理
  10. 基于句式元学习的Twitter分类
  11. 蓝桥杯第八届省赛JAVA真题----正则问题
  12. smarty中js的调用方法
  13. 语C、耽美、盲盒、Lolita……这些95后文化,你看懂了吗?
  14. python数据分析多久能学会_周末深夜,学妹说她想做Python数据分析师....
  15. 新浪微博最新的、通吃网络应用和Air应用的SDK问世了
  16. vue-cli+webpack在生成的项目中使用bootstrap的方法
  17. DoraHacks的笔记
  18. 逻辑回归算法原理MATLAB,逻辑回归算法(MATLAB)
  19. 2017界面UI设计风格流行什么?(一)
  20. 知云文献翻译打不开_科研福音,论文翻译神器系列!

热门文章

  1. 夏季养生要以“清”为贵
  2. Android - xml动画,识别手势动作,代码抽取,获取手机SIM卡串号,获取联系人数据,开机广播,发送/解析短信,报警音乐
  3. 保姆级教程|ECharts图表插件一文搞懂!
  4. 【webview】微信和PC监听浏览器关闭和刷新(亲测可用)
  5. 该来的年终总结,还是来了
  6. ubuntu串口调试工具kermit和minicom
  7. 【年终总结系列 2021】不变的心态应对变化的环境
  8. css 排版_Web排版的未来:CSS字体4级
  9. 【上古秘籍】之Eclipse的秘籍 转
  10. 树莓派sd卡格式化_利用树莓派和移动硬盘搭建下载机,常见视频网站都可下载...