这个解法太巧妙了,充分利用树的特点。
//============================================================================
//
// > File : poj1330.cpp
// > Author : flowertree
// > Time : 2015年11月14日
// > Algorithm : LCA 最近公共祖先问题 巧妙解法
//
//============================================================================
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAX 10005
bool v[MAX];
int f[MAX];
int main()
{
int T;
int a, b;
int m;
cin >> T;
while(T--)
{
memset(f, 0, sizeof(f));
memset(v, false, sizeof(v));
cin >> m;
for(int i = 0; i < m - 1; i++)
{
cin >> a >> b;
f[b] = a;
}
cin >> a >> b;
while(a != 0)
{
v[a] = true;
a = f[a];
}
while(v[b] == false)
{
b = f[b];
}
cout << b << endl;
}
system("pause");
return 0;
}