【题目链接】

点击打开链接

【算法】

tarjan算法求LCA

【代码】

#include<bits/stdc++.h>
#define MAXN 200010
#pragma GOC optimize("O2") using namespace std; int n,k,i,p,fa,q;
int a[MAXN],visit[MAXN],parent[MAXN],maxn[MAXN],
depth[MAXN],x[MAXN],y[MAXN],z[MAXN],ans[MAXN];
vector<int> son[MAXN],vec[MAXN]; int find(int x) {
if (parent[x] == x) return x;
parent[x] = find(parent[x]);
return parent[x];
} void dfs(int dep,int d) {
int i;
depth[dep] = d;
for (i = ; i < son[dep].size(); i++)
dfs(son[dep][i],d+);
} void tarjan(int u) {
int i;
parent[u] = u;
visit[u] = ;
for (i = ; i < vec[u].size(); i++) {
if (y[vec[u][i]] == u && visit[x[vec[u][i]]]) z[vec[u][i]] = find(x[vec[u][i]]);
if (x[vec[u][i]] == u && visit[y[vec[u][i]]]) z[vec[u][i]] = find(y[vec[u][i]]);
}
for (i = ; i < son[u].size(); i++) {
if (!visit[son[u][i]]) {
tarjan(son[u][i]);
parent[son[u][i]] = u;
}
}
} int main() { scanf("%d%d",&n,&k);
for (i = ; i <= n; i++) {
scanf("%d%d",&a[i],&p);
if (p != ) son[p].push_back(i);
else fa = i;
} dfs(fa,); for (i = ; i <= n; i++) {
if (depth[i] > depth[maxn[a[i]]])
maxn[a[i]] = i;
} for (i = ; i <= n; i++) {
if (maxn[a[i]] != i) {
++q;
x[q] = maxn[a[i]];
y[q] = i;
vec[maxn[a[i]]].push_back(q);
vec[i].push_back(q);
}
} tarjan(fa); for (i = ; i <= q; i++) {
ans[a[x[i]]] = max(ans[a[x[i]]],depth[x[i]] + depth[y[i]] - * depth[z[i]]);
}
for (i = ; i <= k; i++) printf("%d\n",ans[i]); return ; }

最新文章

  1. Code First开发系列之领域建模和管理实体关系
  2. one recursive approach for 3, hdu 1016 (with an improved version) , permutations, N-Queens puzzle 分类: hdoj 2015-07-19 16:49 86人阅读 评论(0) 收藏
  3. 3.2---最小栈(CC150)
  4. jquery easyui DataGrid 数据表格 属性
  5. 基础套接字的C#网络编程
  6. Primary Expression
  7. android开源框架和开源项目(转)
  8. Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
  9. serv-u 多域配置
  10. 使用Update Strategy组件无法进行delete操作
  11. Linux shell基础知识(上)
  12. 小程序开发------mpvue开发时间轴
  13. python自定义函数的参数之四种表现形式
  14. Jmeter(三十七)源码导入IDE(转!)
  15. 自学huawei之路-6005-8AP设备启动界面
  16. .NET 中的 async/await 异步编程
  17. 编程(Linux、windows)常见命令
  18. 如何检测NFC芯片型号?NFC手机即可!
  19. java 内存溢出 栈溢出的原因与排查方法
  20. gradle平级项目引用

热门文章

  1. spark与Scala安装过程和步骤及sparkshell命令的使用
  2. JAVA获取前一个月的第一天和最后一天
  3. (type interface {}) to type string
  4. Dynamics CRM 2015/2016 Web API:新的数据查询方式
  5. 生活娱乐 360安全卫士和QQ大战
  6. 哈理工2015 暑假训练赛 zoj 2976 Light Bulbs
  7. 【iOS】系统框架学习
  8. JAVA设计模式之单例模式(转)
  9. mt7620 wifi driver
  10. ubuntu git ssh不通