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
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


浙公网安备 33010602011771号