http://poj.org/problem?id=1330
题意: 给一数,问俩个节点最近的公共最先;
思路:记录用pre【】记录孩子的父亲,把孩子加入到父亲的vector中,一遍bfs()维护节点的层数rank[];
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<set>
#include<queue>
#include<map>
#include<vector>
using namespace std;
const int size=100010;
int pre[size];
int rank[size];
vector<int>e[size];
queue<int>que;
int st;
void bfs()
{
queue<int>que;
que.push(st);rank[st]=0;
vector<int>::iterator it;
while(!que.empty())
{
int cur=que.front();que.pop();
for(it=e[cur].begin();it!=e[cur].end();it++){
rank[*it]=rank[cur]+1;
que.push(*it);
}
}
}
void deal(int a,int b){
while(a!=b){
if(rank[a]>rank[b]) a=pre[a];
else b=pre[b];
}
printf("%d\n",a);
}
int main()
{
freopen("in.in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
memset(pre,0,sizeof(pre));
for(int i=0;i<=n;i++) e[i].clear();
int a,b;
for(int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
e[a].push_back(b);
pre[b]=a;
}
for(int i=1;i<=n;i++)
if(pre[i]==0){st=i;break;}
bfs();
scanf("%d%d",&a,&b);
deal(a,b);
}
return 0;
}