问题描述:
设计一个算法,对于给定的树中2个结点返回它们的最近公共祖先。
编程任务:
对于给定的树,和树中结点对,编程计算结点对的最近公共祖先。
数据输入:
由文件input.txt给出输入数据。第一行有1个正整数n,表示给定的树有n个顶点,编号为1,2,…,n。编号为1
的顶点是树根。接下来的n 行中,第i+1 行描述与i
个顶点相关联的子结点的信息。每行的第一个正整数k表示该顶点的儿子结点数。其后k个数中,每1 个数表示1 个儿子结点的编号。当k=0
时表示相应的结点是叶结点。文件的第n+2 行是1 个正整数m,表示要计算最近公共祖先的m个结点对。接下来的m行,每行2
个正整数,是要计算最近公共祖先的结点编号。
结果输出:
将编程计算出的m个结点对的最近公共祖先结点编号输出到文件output.txt。每行3 个
正整数,前2 个是结点对编号,第3 个是它们的最近公共祖先结点编号。
输入文件示例 输出文件示例
input.txt
12
3 2 3 4
2 5 6
0
0
2 7 8
2 9 10
0
0
0
2 11 12
0
0
5
3 11
7 12
4 8
9 12
8 10
output.txt
3 11 1
7 12 2
4 8 1
9 12 6
8 10 2
解题思路: (节点数目n, 1编号的根)
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 105
struct node
{
}edges[MAX*MAX];
int n, m;
int p[MAX][20], deep[MAX];
int first[MAX], num;
inline void add(int u,int v)
{
}
void read_graph()
{
}
void dfs(int u)
{
}
int LCA(int x,int y)
{
}
int main()
{
//
}