poj 1330 nearest common ancestor

来源:互联网 发布:大数据项目案例分析 编辑:程序博客网 时间:2024/06/10 20:08
/*busyfisher 2013/6/23poj 1330 nearest common ancestor用数组分别记录节点到根节点的路径,找出两个数组中,第一个相同的元素Memory: 364KTime: 141MSLanguage: C++Result: Accepted*/#include <iostream>#include <cstring>using namespace std;#define maxn 10000+100int nodes;   //节点数int parent[maxn];   //记录每个节点的父节点int ancestor1[maxn],ancestor2[maxn];    //记录节点到根节点的路径void get_nearest_common_ancestor(int m,int n){int root;for(int i=1;i<=nodes;i++)if(parent[i] == 0){root = i;parent[i]=i;break;}if(m == n){cout<<m<<endl;return;}int temp_parent,start;start = m;temp_parent = parent[start];int count1 = 1;ancestor1[count1] = start;while(start != temp_parent){          //往根节点回溯start = parent[start];temp_parent = parent[start];count1++;ancestor1[count1] = start;}start = n;temp_parent = parent[start];int count2 = 1;ancestor2[count2] = start;while(start != temp_parent){start = parent[start];temp_parent = parent[start];count2++;ancestor2[count2] = start;}for(int i=1;i<=count1;i++)for(int j=1;j<=count2;j++)if(ancestor1[i] == ancestor2[j]){cout<<ancestor1[i]<<endl;return;}return;}int main(){int cases;cin>>cases;while(cases--){cin>>nodes;memset(parent,0,sizeof(parent));memset(ancestor1,0,sizeof(ancestor1));memset(ancestor2,0,sizeof(ancestor2));for(int i=1;i<nodes;i++){int a,b;cin>>a>>b;parent[b] = a;}int m,n;cin>>m>>n;get_nearest_common_ancestor(m,n);}return 0;}

原创粉丝点击