| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
DFS序+ST表。 47ms#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<functional>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<climits>
#include<list>
#include<iomanip>
#include<stack>
#include<set>
#include<ctime>
#define pb push_back
#define pii pair<int,int>
#define LL __int64
#define INF 0x7fffffff
#define LLINF 0x7fffffffffffffff
using namespace std;
const int N = 10005;
int ver[N*2], R[N*2], first[N], vcnt;
bool vis[N];
struct eg{
int u, v, nex;
eg(){}
eg(int a, int b, int c) { u = a, v = b, nex = c; }
}edg[N*2];
int fir[N*2], ecnt;
void add(int a, int b){
edg[ecnt] = eg(a, b, fir[a]);
fir[a] = ecnt++;
edg[ecnt] = eg(b, a, fir[b]);
fir[b] = ecnt++;
}
bool in[N];
void dfs(int u, int dep){
vis[u] = 1, ver[++vcnt] = u, R[vcnt] = dep, first[u] = vcnt;
for(int k = fir[u]; k != -1; k = edg[k].nex){
int v = edg[k].v;
if( !vis[v] ){
dfs(v, dep+1);
ver[++vcnt] = u, R[vcnt] = dep;
}
}
}
int dp[N*2][20];
void ST(int n){
for(int i = 1; i <= n; ++i) dp[i][0] = i;
for(int j = 1; (1<<j) <= n; ++j)
for(int i = 1; i + (1<<j)-1 <= n; ++i){
int a = dp[i][j-1], b = dp[i+(1<<j-1)][j-1];
dp[i][j] = R[a] > R[b]? b : a;
}
}
int query(int x, int y){
int k = (int)(log(y-x+1.0)/log(2.0));
int s1 = dp[x][k], s2 = dp[y-(1<<k)+1][k];
return R[s1] > R[s2] ? s2 : s1;
}
int LCA(int u, int v){
if(first[u] <= first[v]) return ver[query(first[u], first[v])];
else return ver[query(first[v], first[u])];
}
int main(){
int T, a, b;
scanf("%d", &T);
while( T-- ){
int n;
memset(fir, -1, sizeof(fir));
memset(vis, 0, sizeof(vis));
memset(in, 0, sizeof(in));
ecnt = 0, vcnt = 0;
scanf("%d", &n);
for(int i = 1; i < n; ++i){
scanf("%d %d", &a, &b);
add(a, b);
in[b] = 1;
}
int rt = 0;
for(int i = 1; !rt && i <= n; ++i) if( !in[i] ) rt = i;
dfs(rt, 1);
ST(n*2-1);
int u, v;
scanf("%d %d", &u, &v);
printf("%d\n", LCA(u,v));
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator