http://poj.org/problem?id=1330
算法见这篇文章
完整代码:
/*63ms,1752KB*/
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int mx = 10005;
vector<int> son[mx];
int fa[mx], query[mx];
bool vis[mx], hasroot[mx], ok;
int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}
void tarjan(int u)
{
if (ok) return;
vis[u] = true;
int v = query[u];
if (v && vis[v])
{
printf("%d\n", find(v));
ok = true;
return;
}
for (int i = 1; i <= son[u][0]; ++i)
{
if (ok) return;
v = son[u][i];
if (!vis[v]) tarjan(v), fa[v] = u;
}
}
int main()
{
int t, n, i, j, k;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (i = 1; i <= n; ++i) fa[i] = i;
for (i = 1; i <= n; ++i) son[i].clear(), son[i].push_back(0);
memset(hasroot, 0, sizeof(hasroot));
for (i = 1; i < n; ++i)
{
scanf("%d%d", &j, &k);
++son[j][0];
son[j].push_back(k);
hasroot[k] = true;
}
memset(query, 0, sizeof(query));
scanf("%d%d", &i, &j);
query[i] = j, query[j] = i;
ok = false;
memset(vis, 0, sizeof(vis));
for (i = 1; i <= n; ++i)
if (!hasroot[i]) {tarjan(i); break;}///从根节点进入
}
return 0;
}