首页 > 代码库 > poj----1330Nearest Common Ancestors(简单LCA)
poj----1330Nearest Common Ancestors(简单LCA)
题目连接 http://poj.org/problem?id=1330
就是构建一棵树,然后问你两个节点之间最近的公共父节点是谁?
代码:
1 /*Source Code 2 Problem: 1330 User: huifeidmeng 3 Memory: 1232K Time: 63MS 4 Language: C++ Result: Accepted 5 6 Source Code 7 */ 8 #include<iostream> 9 #include<vector>10 #include<cstdio>11 #include<cstring>12 #include<cstdlib>13 using namespace std;14 const int maxn=10002;15 vector<int> tree[maxn],qus[maxn];16 int rank[maxn],father[maxn];17 bool vis[maxn];18 int rudu[maxn];19 int lroot[maxn];20 void init(int n){21 memset(vis,0,sizeof(vis));22 memset(rudu,0,sizeof(rudu));23 memset(lroot,0,sizeof(lroot));24 for(int i=1;i<=n;i++){25 father[i]=i;26 rank[i]=1;27 tree[i].clear();28 qus[i].clear();29 }30 }31 int find(int a){32 while(a!=father[a])33 a=father[a];34 return a;35 }36 void Union(int a,int b)37 {38 int x=find(a);39 int y=find(b);40 if(x==y) return ;41 if(rank[x]<rank[y]){42 rank[y]+=rank[x];43 father[x]=y;44 }45 else {46 rank[x]+=rank[y];47 father[y]=x;48 }49 }50 void LCA(int u)51 {52 lroot[u]=u;53 int len=tree[u].size();54 for(int i=0;i<len;i++){55 LCA(tree[u][i]);56 Union(u,tree[u][i]);57 lroot[find(u)]=u;58 }59 vis[u]=1;60 int ss=qus[u].size();61 for(int i=0;i<ss;i++){62 if(vis[qus[u][i]]){63 printf("%d\n",lroot[find(qus[u][i])]);64 return ;65 }66 }67 }68 int main()69 {70 int cas,n,u1,u2;71 //freopen("test.in","r",stdin);72 scanf("%d",&cas);73 while(cas--){74 scanf("%d",&n);75 init(n);76 for(int i=1;i<n;i++){77 scanf("%d%d",&u1,&u2);78 tree[u1].push_back(u2);79 rudu[u2]++; 80 }81 scanf("%d%d",&u1,&u2);82 qus[u1].push_back(u2);83 qus[u2].push_back(u1);84 for(int i=1;i<=n;i++){85 if(0==rudu[i]){ //找到root86 LCA(i);87 break;88 }89 }90 }91 return 0;92 }
poj----1330Nearest Common Ancestors(简单LCA)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。