POJ

来源:互联网 发布:观看仙侠学院 网络电影 编辑:程序博客网 时间:2024/06/16 03:42

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;}


原创粉丝点击