-
D - Nearest Common Ancestors
- POJ - 1330
-
#include<stdio.h> #include<string.h> #include<vector> #define M 10007 using namespace std; int in[M],pre[M],cnt[M]; bool vis[M],flag; vector<int>v[M]; int n,m,t,a,b,root; void init() { memset(in,0,sizeof(in)); memset(cnt,0,sizeof(cnt)); memset(vis,false,sizeof(vis)); for(int i=1; i<=n; i++) { v[i].clear(); pre[i]=i; } flag=0; } int fond(int x) { return x==pre[x]?x:pre[x]=fond(pre[x]); } void unin(int x,int y) { int xx=fond(x); int yy=fond(y); pre[xx]=yy; } void dfs(int x) { if(flag)return ; int len=v[x].size(); for(int i=0; i<len; i++) { dfs(v[x][i]); unin(v[x][i],x); } vis[x] = true; if(x==a&&vis[b]) { printf("%d\n",fond(b)); flag=1; return ; } else if(x==b&&vis[a]) { printf("%d\n",fond(a)); flag=1; return ; } } int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); init(); for(int i=1; i<n; i++) { scanf("%d%d",&a,&b); v[a].push_back(b); in[b]++; } scanf("%d%d",&a,&b); for(int i=1; i<=n; i++) if(!in[i]) { root=i; break; } dfs(root); } return 0; }
D - Nearest Common Ancestors -离线LCA-TARJAN-模板
最新推荐文章于 2019-08-19 19:49:28 发布