POJ
来源:互联网 发布:观看仙侠学院 网络电影 编辑:程序博客网 时间:2024/06/16 08:06
POJ1330题目
思路: LCA基础题,就一个询问。这里用的tarjan算法
推荐博客:大神博客
代码:
#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int maxn = 1e4+10;int f[maxn], h[maxn], anc[maxn], vis[maxn], isRoot[maxn];int ql,qr;struct node{ int to,next; node(){} node(int a,int b) { to = a; next = b; }}edge[maxn];int edgenum = 0; int t,n;void add(int from, int to){ edge[edgenum] = node(to, h[from]); h[from] = edgenum++;}int getf(int i){ return i == f[i] ? i : f[i] = getf(f[i]);}int join(int i,int j){ int x = getf(i), y = getf(j); if(x != y) f[y] = x; return 0;}int ans = -1;void tarjan(int u){ if(~ans) return; anc[u] = u; for(int i = h[u]; ~i ; i = edge[i].next) { int v = edge[i].to; tarjan(v); join(u,v); anc[ getf(u) ] = u; } vis[u] = 1; if(u == ql && vis[qr]) ans = getf(qr); else if(u == qr && vis[ql]) ans = getf(ql); return;}void init(){ edgenum = 0; ans = -1; for(int i = 1; i <= n; i++) f[i] = i ,anc[i] = 0, vis[i] = 0, isRoot[i] = 0; for(int i = 1; i <= n; i++) h[i] = -1;}int main(){ scanf("%d",&t); while(t--) { scanf("%d",&n); init(); for(int i = 1; i < n ; i++) { int a,b; scanf("%d%d",&a,&b); add(a,b); isRoot[b] ++; } scanf("%d%d",&ql,&qr); int r; for(int i = 1; i <= n; i++) if(!isRoot[i]) r = i; tarjan(r); printf("%d\n",ans); } return 0;}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- iptabes打开指定端口
- GIT 不受版本控制
- 使用本地广播 LocalBroadcastReceiver
- sql
- Leetcode:207. Course Schedule
- POJ
- PAT甲级真题及训练集(10)--1036. Boys vs Girls (25)
- Kotlin Reference (八) 可见性修饰符, data class,object Claz
- cmake:vs2015/MinGW静态编译leveldb
- 安卓学习第一天:打造布局
- 百度地图SDK配置 运行报错:INSTALL_FAILED_NO_MATCHING_ABIS
- 水果消除(搜索之DFS)
- JavaScript记录
- Ubuntu 16.04 安装Anaconda3