POJ 1330 Nearest Common Ancestors(lca)
阿新 • • 發佈:2017-10-07
我不 ont compute data pri rst nss cfb str
In the figure, each node is labeled with an integer from {1, 2,...,16}. Node 8 is the root of the tree. Node x is an ancestor of node y if node x is in the path between the root and node y. For example, node 4 is an ancestor of node 16. Node 10 is also an ancestor of node 16. As a matter of fact, nodes 8, 4, 10, and 16 are the ancestors of node 16. Remember that a node is an ancestor of itself. Nodes 8, 4, 6, and 7 are the ancestors of node 7. A node x is called a common ancestor of two different nodes y and z if node x is an ancestor of node y and an ancestor of node z. Thus, nodes 8 and 4 are the common ancestors of nodes 16 and 7. A node x is called the nearest common ancestor of nodes y and z if x is a common ancestor of y and z and nearest to y and z among their common ancestors. Hence, the nearest common ancestor of nodes 16 and 7 is node 4. Node 4 is nearer to nodes 16 and 7 than node 8 is.
For other examples, the nearest common ancestor of nodes 2 and 3 is node 10, the nearest common ancestor of nodes 6 and 13 is node 8, and the nearest common ancestor of nodes 4 and 12 is node 4. In the last example, if y is an ancestor of z, then the nearest common ancestor of y and z is y.
Write a program that finds the nearest common ancestor of two distinct nodes in a tree.
Print exactly one line for each test case. The line should contain the integer that is the nearest common ancestor.
POJ 1330 Nearest Common Ancestors
A rooted tree is a well-known data structure in computer science and engineering. An example is shown below:
In the figure, each node is labeled with an integer from {1, 2,...,16}. Node 8 is the root of the tree. Node x is an ancestor of node y if node x is in the path between the root and node y. For example, node 4 is an ancestor of node 16. Node 10 is also an ancestor of node 16. As a matter of fact, nodes 8, 4, 10, and 16 are the ancestors of node 16. Remember that a node is an ancestor of itself. Nodes 8, 4, 6, and 7 are the ancestors of node 7. A node x is called a common ancestor of two different nodes y and z if node x is an ancestor of node y and an ancestor of node z. Thus, nodes 8 and 4 are the common ancestors of nodes 16 and 7. A node x is called the nearest common ancestor of nodes y and z if x is a common ancestor of y and z and nearest to y and z among their common ancestors. Hence, the nearest common ancestor of nodes 16 and 7 is node 4. Node 4 is nearer to nodes 16 and 7 than node 8 is.
For other examples, the nearest common ancestor of nodes 2 and 3 is node 10, the nearest common ancestor of nodes 6 and 13 is node 8, and the nearest common ancestor of nodes 4 and 12 is node 4. In the last example, if y is an ancestor of z, then the nearest common ancestor of y and z is y.
Write a program that finds the nearest common ancestor of two distinct nodes in a tree.
Input
The input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case starts with a line containing an integer N , the number of nodes in a tree, 2<=N<=10,000. The nodes are labeled with integers 1, 2,..., N. Each of the next N -1 lines contains a pair of integers that represent an edge --the first integer is the parent node of the second integer. Note that a tree with N nodes has exactly N - 1 edges. The last line of each test case contains two distinct integers whose nearest common ancestor is to be computed.Output
Sample Input
2 16 1 14 8 5 10 16 5 9 4 6 8 4 4 10 1 13 6 15 10 11 6 7 10 2 16 3 8 1 16 12 16 7 5 2 3 3 4 3 1 1 5 3 5
Sample Output
4 3
一道關於LCA的算法題,太弱的我不會做。貼出大神的AC代碼,僅供參考學習
#include<iostream> #include<vector> #define MAX 10010 using namespace std; int n,flag; int f[MAX],r[MAX],ancestor[MAX]; int indegreen[MAX],vis[MAX]; vector<int> head[MAX],Que[MAX]; void Init() { int i,a,b; cin>>n; flag=0; for(i=1;i<=n;i++) { head[i].clear(); Que[i].clear(); f[i]=i; r[i]=1; ancestor[i]=0; indegreen[i]=0; vis[i]=0; } for(i=1;i<n;i++) { cin>>a>>b; head[a].push_back(b); indegreen[b]++; } cin>>a>>b; Que[a].push_back(b); Que[b].push_back(a); } int Find(int u) { if(f[u]==u) return f[u]; else f[u]=Find(f[u]); return f[u]; } void Union(int v,int u) { int a,b; a=Find(v); b=Find(u); if(a==b) return ; if(r[a]<=r[b]) { f[a]=b; r[b]+=r[a]; } else { f[b]=a; r[a]+=r[b]; } } void LCA(int k) { int i,size; size=head[k].size(); ancestor[k]=k; for(i=0;i<size;i++) { if(flag) break; LCA(head[k][i]); Union(k,head[k][i]); ancestor[Find(k)]=k; } vis[k]=1; size=Que[k].size(); for(i=0;i<size;i++) { if(vis[Que[k][i]]) { flag=1; cout<<ancestor[Find(Que[k][i])]<<endl; return ; } } } int main() { int T; cin>>T; while(T--) { Init(); for(int i=1;i<=n;i++) { if(!indegreen[i]) { LCA(i); break; } } } return 0; }
POJ 1330 Nearest Common Ancestors(lca)