using namespace std;
#define MAX_NODES 1024
vector<int> tree[MAX_NODES];
int ancestor[MAX_NODES];
int visited[MAX_NODES];
int question[MAX_NODES][MAX_NODES];
void Init(int node1, int node2)
{
for (int i = 0; i < MAX_NODES; i++)
{
ancestor[MAX_NODES] = -1;
visited[MAX_NODES] = 0;
for (int j = 0; j < MAX_NODES; j++)
{
question[i][j] = 0;
}
}
question[node1][node2] = 1;
question[node2][node1] = 1;
}
void MakeUnion(int *p, int *rank, int node)
{
p[node] = node;
rank[node] = 0;
}
int FindSet(int *p, int node)
{
if (p[node] != node)
{
p[node] = FindSet(p, p[node]);
}
return p[node];
}
void Link(int *p, int *rank, int node1, int node2)
{
if (rank[node1] < rank[node2])
{
p[node1] = node2;
}
else if (rank[node1] == rank[node2])
{
p[node1] = node2;
rank[node2]++;
}
else
{
p[node2] = node1;
}
}
void Union(int *p, int *rank, int node1, int node2)
{
Link(p, rank, FindSet(p, node1), FindSet(p, node2));
}
void Lca(int *p, int *rank, int node)
{
MakeUnion(p, rank, node);
ancestor[FindSet(p, node)] = node;
for (int i = 0; i < tree[node].size(); i++)
{
int node2 = tree[node][i];
Lca(p, rank, node2);
Union(p, rank, node, node2);
ancestor[FindSet(p, node)] = node;
}
visited[node] = 1;
for (i = 0; i < MAX_NODES; i++)
{
if (question[node][i] == 1 && visited[i] == 1)
{
printf("%d && %d 's ancestor is %d\n", node , i, ancestor[FindSet(p, i)]);
}
}
}