您的位置:首页 > 其它

POJ 1330 Nearest Common Ancestors

2017-07-20 11:31 260 查看
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
#define N 100005
using namespace std;
vector <int> vec[N] ;
vector <pair<int,int> > query[N];
struct node{
int first , second;
}e;

vector <node> query[N];

int vis[N] , pre[N] , ans[N];
int Find(int x){
if(pre[x] == x){
return x;
}else{
pre[x] = Find(pre[x]);
return pre[x];
}
}
void dfs(int u , int fa){

pre[u] = u;
vis[u] = 1;
for(int i = 0 ; i < vec[u].size() ; i ++){
int v = vec[u][i];
if(v == fa) continue;
dfs(v , u);
}

for(int i = 0 ; i < query[u].size() ; i++){
int v = query[u][i].first;
int id = query[u][i].second;
if(vis[v] == 1){
ans[id] = Find(v);
}
}

pre[u] = fa;
}

int main(){
int T;
scanf("%d" ,&T);
while(T --){
int n , x, y;
scanf("%d" , &n);
for(int i = 0 ; i < n - 1 ; i ++){
scanf("%d%d" , &x , &y);
vec[x].push_back(y);
vec[y].push_back(x);
vis[y] = 1;
}
for(int i = 1 ; i <= n ; i ++ ){
cout << i << "==========" << endl;
for(int k = 0 ; k  <  vec[i].size() ; k ++){
cout << vec[i][k] << " ";
}
cout << endl;
}
int q;
scanf("%d",&q);
for(int i = 0 ; i < q ; i ++){
scanf("%d%d" , &x , &y);
query[x].push_back({y , i});
query[y].push_back({x , i});
}
for(int i = 1 ; i <= n ; i ++){
if(vis[i] == 0){
memset(vis , 0 ,sizeof(vis));
dfs(i , -1);
break;
}
}
for(int i = 0 ; i < q ; i ++){
printf("%d\n" ,ans[i]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: