poj 1330 Nearest Common Ancestors

求两个结点的最近公共祖先。提供一种简单的思路:先从一个结点往回遍历至根,所到的结点做一个标记,再从第二个结点往回遍历至根,如果遍历到的结点已经标记过,那么这个结点就是最近公共祖先。


#include <iostream>
#include<string>
#include<stdio.h>
using namespace std;

struct Node{
   int p;
}node[10010];

bool visit[10010];

int main()
{
   int t,ans;
   scanf("%d",&t);
   while(t--)
   {
       int n;
       scanf("%d",&n);
       for(int i = 1;i < n;i++)
       {
           node[i].p = i;
           visit[i] = false;
       }
       for(int i = 1;i < n;i++)
       {
           int a,b;
           scanf("%d %d",&a,&b);
           node[b].p = a;
       }
       int n1,n2;
       scanf("%d %d",&n1,&n2);
       visit[n1] = visit[n2] = true;
       while(true)
       {
           if(node[n1].p == n1) break;
           n1 = node[n1].p;
           visit[n1] = true;
       }
       while(true)
       {
           if(node[n2].p == n2) break;
           n2 = node[n2].p;
           if(visit[n2])
           {
               ans = n2;
               break; //一定要break,不然找到的是根结点
           }
       }
       printf("%d\n",ans);

   }

    return 0;
}


你可能感兴趣的:(poj 1330 Nearest Common Ancestors)