http://poj.org/problem?id=1330
题意:给出一个图,求两个点的最近公共祖先。
sl :水题,贴个模板试试代码。本来是再敲HDU4757的中间发现要用LCA, 操蛋只好用这个题目试试自己写的对不对。 下面是个倍增的写法,挺实用的。
好了,继续。。。
;
][MAX],dep[MAX];
G[ G[to].push_back( }
dep[u]=d; parent[][u]=pre;
;i<G[u].size();i++) {
);
}
}
;i<=n;i++) {
x=i; }
}
dfs(x,-,);
;k<;k++) {
;v<=n;v++) {
) parent[k+][v]=-;
][v]=parent[k][parent[k][v]];
}
}
}
;k<;k++) {
) v=parent[k][v];
}
;k>=;k--) {
u=parent[k][u]; v=parent[k][v];
}
}
][u];
}
;i<MAX;i++) G[i].clear();
}
scanf( CLEAR();
scanf( memset(is_root, ;i<=n-;i++) {
scanf( add_edge(a,b);
is_root[b]= }
init();
scanf( printf( }
;
}
][MAX],dep[MAX];
G[ G[to].push_back( }
dep[u]=d; parent[][u]=pre;
;i<G[u].size();i++) {
);
}
}
;i<=n;i++) {
x=i; }
}
dfs(x,-,);
;k<;k++) {
;v<=n;v++) {
) parent[k+][v]=-;
][v]=parent[k][parent[k][v]];
}
}
}
;k<;k++) {
) v=parent[k][v];
}
;k>=;k--) {
u=parent[k][u]; v=parent[k][v];
}
}
][u];
}
;i<MAX;i++) G[i].clear();
}
scanf( CLEAR();
scanf( memset(is_root, ;i<=n-;i++) {
scanf( add_edge(a,b);
is_root[b]= }
init();
scanf( printf( }
;
}
SB CODE