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