Codeforces Round #359 (Div. 2)D. Kay and Snowflake【树的重心】
2016-07-02 22:27
375 查看
求某个结点子树的重心
情况1:重链上的儿子结点i为根的树结点数小于父结点j为根的树节点数,j为重心
情况2:与1相反时,重心必在j到i为跟的树的重心的路径上
情况1:重链上的儿子结点i为根的树结点数小于父结点j为根的树节点数,j为重心
情况2:与1相反时,重心必在j到i为跟的树的重心的路径上
/* *********************************************** Author :Maltub Email :xiang578@foxmail.com Blog :htttp://www.xiang578.com ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> //#include <bits/stdc++.h> #define rep(i,a,n) for(int i=a;i<n;i++) #define per(i,a,n) for(int i=n-1;i>=a;i--) #define pb push_back using namespace std; typedef vector<int> VI; typedef long long ll; const ll mod=1000000007; const int N=300000+10; vector<int>g ; int n,q,son ,fa ,ans ; void dfs(int x) { son[x]=1; ans[x]=x; for(int i=0; i<g[x].size(); i++) { int y=g[x][i]; dfs(y); son[x]+=son[y]; } for(int i=0;i<g[x].size();i++) { if(son[g[x][i]]*2>son[x]) ans[x]=ans[g[x][i]]; } while(2*(son[x]-son[ans[x]])>son[x]) { ans[x]=fa[ans[x]]; } } int main() { int t; //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%d%d",&n,&q); for(int i=1; i<=n; i++) g[i].clear(); for(int i=2; i<=n; i++) { scanf("%d",&fa[i]); g[fa[i]].push_back(i); } dfs(1); for(int i=0; i<q; i++) { scanf("%d",&t); printf("%d\n",ans[t]); } return 0; }
相关文章推荐
- Visual Studio Express 在C/C++项目中无法为项目添加新建项
- ArcGIS Server发布的地图服务不显示地图的原因分析
- Navicat Premium 将sqlserver 数据库 导入mysql 中
- 无线基础知识普及第一讲
- ZooKeeper翻译(一)
- css水平垂直居中
- 【android应用市场】android应用市场集合
- 1193 - Dice (II)
- 开启自定义摄像头
- 一个新手学习python的过程中遇到的一些问题及解决方法
- 为什么不能往Android的Application对象里存储数据
- C++之decltype和auto的用法
- JAVA 多态-深层次理解
- 字符串最后一个单词的长度
- 图算法1之1002
- 把准用户心思杀手锏:显性需求与隐性需求。
- nginx 日志分析工具goaccess
- nodejs学习一
- AngularJs的UI组件ui-Bootstrap分享(六)——Tabs
- LinearLayout布局中View被挤到屏幕外