码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1330 Nearest Common Ancestors(Tree)

时间:2014-12-17 22:19:25      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   io   color   os   sp   for   

 

       题目:Nearest Common Ancestors

  根据输入建立树,然后求2个结点的最近共同祖先。

  注意几点:

  (1)记录每个结点的父亲,比较层级时要用;

  (2)记录层级;

  (3)记录每个结点的孩子,vector<int> v[M]写在主函数里面,放在外面超时

代码:

#include<iostream>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;

const int M = 10001;  
//vector<int> v[M];
int level[M];
int father[M];

void visitEveryone(vector<int> v[], int one, int _level)
{
    level[one] = _level;
    for(vector<int>::iterator it = v[one].begin(); it != v[one].end(); ++it)
    {
        visitEveryone(v, *it, _level+1);
    }
}

int main()
{
    int T,N,a,b,i,j;
    scanf("%d", &T);
    while(T--)
    {
        vector<int> v[M];
        scanf("%d", &N);
        memset(father, 0, (N+1)*sizeof(int));
        for(i = 1; i < N; ++i)
        {
            scanf("%d %d", &a, &b);
            father[b] = a;
            v[a].push_back(b);
        }
        scanf("%d %d", &a, &b);
        for(j=1; father[j] > 0 && j <= N; ++j);

        visitEveryone(v, j, 0);        
        
        while(a != b)
        {
     
            if(level[a] < level[b])
                b = father[b];
            else
                a = father[a];
        }         
 
        printf("%d\n",a);
    }
    return 0;
}

 

POJ 1330 Nearest Common Ancestors(Tree)

标签:style   blog   http   ar   io   color   os   sp   for   

原文地址:http://www.cnblogs.com/HpuAcmer/p/4170379.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!