博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tarjan LCA
阅读量:5306 次
发布时间:2019-06-14

本文共 1286 字,大约阅读时间需要 4 分钟。

#include 
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef pair
P;int n, m, s;struct edge{ int to, nxt;}e[1000005];int h[100005], cnt;void addedge(int x, int y){ cnt++; e[cnt].to = y; e[cnt].nxt = h[x]; h[x] = cnt; cnt++; e[cnt].to = x; e[cnt].nxt = h[y]; h[y] = cnt;}int vis[500005], fa[500005], ans[500005];vector

v[500005];int find(int x){ return fa[x] == x ? x : fa[x] = find(fa[x]);}void merge(int x, int y){ int xx = find(x), yy = find(y); fa[yy] = xx;}void Tarjan(int x, int f){ vis[x] = 1; for(int i = h[x]; i; i = e[i].nxt){ if(e[i].to == f) continue; Tarjan(e[i].to, x); merge(x, e[i].to); } for(int i = 0; i < v[x].size(); i ++){ if(vis[v[x][i].first]){ ans[v[x][i].second] = find(v[x][i].first); } }}int main(){ scanf("%d%d%d", &n, &m, &s); for(int i = 1; i < n; i ++){ int x, y; scanf("%d%d", &x, &y); addedge(x, y); } for(int i = 1; i <= m; i ++){ int x, y; scanf("%d%d", &x, &y); v[x].push_back(make_pair(y, i)); v[y].push_back(make_pair(x, i)); } for(int i = 1; i <= n; i ++) fa[i] = i; Tarjan(s, 0); for(int i = 1; i <= m; i ++){ printf("%d ", ans[i]); } return 0;}

转载于:https://www.cnblogs.com/infinityedge/p/7629833.html

你可能感兴趣的文章
简单了解HashCode()
查看>>
闭包理解
查看>>
asp.net C#后台实现下载文件的几种方法(全)
查看>>
Web前端开发工程师的具备条件
查看>>
实用Android开发工具和资源精选
查看>>
TileMap
查看>>
JS属性大全
查看>>
java复制文件
查看>>
第一册:lesson seventy nine.
查看>>
GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
查看>>
团队作业
查看>>
数据持久化时的小bug
查看>>
mysql中key 、primary key 、unique key 与index区别
查看>>
bzoj2257
查看>>
Linux查看文件编码格式及文件编码转换<转>
查看>>
Leetcode: Find Leaves of Binary Tree
查看>>
Vue 模板解释
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
将多张图片和文字合成一张图片
查看>>