POJ 1330Nearest Common Ancestors LCA

来源:互联网 发布:暗影格斗2mac 编辑:程序博客网 时间:2024/06/05 22:46

POJ 1330

可以说是经典的LCA求最近公共祖先的模板题,先入门感受下LCA,还有poj运行STL会WA,所以建议使用静态连接的邻接表做,还有codeforces的#include<bits/stdc++.h>头文件也不支持。

代码如下:

#include<cstdio>#include<vector>#include<algorithm>#include<cstring>using namespace std;typedef long long LL;#define INF 0x3f3f3f3fconst int MAXN=10005;int q1,q2,father[MAXN],res,indeg[MAXN];struct Edge{  int to;  Edge *next;}e[MAXN*2],*cur,*adj[MAXN];void addEdge(Edge *head[],int u,int v){  cur->to=v;  cur->next=head[u];  head[u]=cur++;}int findset(int u){  if(father[u]==u) return u;  return father[u]=findset(father[u]);}void Tarjan(int u){  father[u]=u;  for(Edge *it=adj[u];it;it=it->next)  {    int to=it->to;    Tarjan(to);    father[to]=u;  }  if(u==q1||u==q2)  {    if(u!=q1) swap(q1,q2);    if(father[q2]) res=findset(father[q2]);  }}void init(int n){  for(int i=0;i<=n;i++)  {    adj[i]=NULL;    indeg[i]=0;father[i]=0;  }  cur=e;}int main(){  int t;  scanf("%d",&t);  while(t--)  {    int n,u,v;    scanf("%d",&n);    init(n);    for(int i=1;i<n;i++)    {      scanf("%d%d",&u,&v);      addEdge(adj,u,v);indeg[v]++;    }    scanf("%d%d",&q1,&q2);    for(int i=1;i<=n;i++)    {      if(indeg[i]==0)      {        Tarjan(i);break;      }    }    printf("%d\n",res);  }}


0 0