POJ 1330 LCA Tarjan

View Code 
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAX 10005
 4 
 5 
 6 int father[MAX],son[MAX],vis[MAX],tail[MAX];
 7 int fx,fy;
 8 struct Edge
 9 {
10     int e,next;
11 }edge[MAX];
12 
13 int Find_Set(int x)
14 {
15     if(father[x]==x)return x;
16     return Find_Set(father[x]);
17 }
18 void Union(int x,int y)
19 {
20     int fx=Find_Set(x);
21     int fy=Find_Set(y);
22     if(son[fx]>=son[fy])
23     {
24         father[fy]=fx;
25         son[fx]+=son[fy];
26     }
27     else
28     {
29         father[fx]=fy;
30         son[fy]+=son[fx];
31     }
32 }
33 
34 void Init()
35 {
36     memset(tail,-1,sizeof(tail));
37     memset(vis,0,sizeof(vis));
38 }
39 void Tarjan(int u)
40 {
41     for(int i=tail[u];i!=-1;i=edge[i].next)
42     {
43         int v=edge[i].e;
44         Tarjan(v);
45         Union(u,v);
46         vis[v]=2;
47     }
48     if(fx==u&&vis[fy]==2)printf("%d\n",Find_Set(fy));
49     else if(fy==u&&vis[fx]==2)printf("%d\n",Find_Set(fx));
50 }
51 int main()
52 {
53     int t,n,x,y,root;
54     scanf("%d",&t);
55     while(t--)
56     {
57         scanf("%d",&n);
58         Init();
59         for(int i=1;i<n;i++)
60         {
61             scanf("%d%d",&x,&y);
62             edge[i].e=y;
63             edge[i].next=tail[x];
64             tail[x]=i;
65             vis[y]=1;
66         }
67         scanf("%d%d",&fx,&fy);
68         for(int i=1;i<=n;i++)
69         {
70             father[i]=i;
71             son[i]=0;
72             if(vis[i]==0)
73             {
74                 root=i;
75                 vis[i]=1;
76             }
77         }
78         Tarjan(root);
79     }
80     return 0;
81
posted @ 2013-02-28 15:22  byluoluo  阅读(58)  评论(0)    收藏  举报