tarjan-LCA模板

洛谷P3379

 1 #include <cstdio>
 2 
 3 using namespace std;
 4 
 5 const int max_n=5000050;
 6 
 7 struct etype{
 8     int t,next;
 9 };
10 struct qtype{
11     int t,next,id;
12 };
13 
14 etype e[2*max_n];
15 qtype q[2*max_n];
16 int a[max_n],b[max_n],ans[max_n],fa[max_n];
17 bool vis[max_n];
18 int cnt;
19 
20 void addedge(int u,int v)
21 {
22     cnt++;
23     e[cnt].t=v;e[cnt].next=a[u];a[u]=cnt;
24 }
25 
26 void addquery(int i,int u,int v)
27 {
28     cnt++;
29     q[cnt].t=v;q[cnt].id=i;q[cnt].next=b[u];b[u]=cnt;
30 }
31 
32 int findfather(int k)
33 {
34     if (fa[k]==k) return k;
35     fa[k]=findfather(fa[k]);
36     return fa[k];
37 }
38 
39 void dfs(int k)
40 {
41     fa[k]=k;vis[k]=true;
42     int i=b[k];
43     while (i>0)
44     {
45         if (vis[q[i].t])
46         {
47             if (ans[q[i].id]==0) ans[q[i].id]=findfather(q[i].t);
48         }
49         i=q[i].next;
50     }
51     i=a[k];
52     while (i>0)
53     {
54         if (!vis[e[i].t])
55         {
56             dfs(e[i].t);
57             fa[e[i].t]=k;
58         }
59         i=e[i].next;
60     }
61 }
62 int main()
63 {
64     int n,m,s;
65     scanf("%d%d%d",&n,&m,&s);
66     for (int i=1;i<=n;i++) a[i]=0;
67     cnt=0;
68     for (int i=1;i<n;i++)
69     {
70         int x,y;
71         scanf("%d%d",&x,&y);
72         addedge(x,y);addedge(y,x);
73     }
74     for (int i=1;i<=n;i++) b[i]=0;
75     cnt=0;
76     for (int i=1;i<=m;i++)
77     {
78         int x,y;
79         scanf("%d%d",&x,&y);
80         addquery(i,x,y);addquery(i,y,x);
81     }
82     for (int i=1;i<=n;i++) vis[i]=false;
83     for (int i=1;i<=m;i++) ans[i]=0;
84     dfs(s);
85     for (int i=1;i<=m;i++) printf("%d\n",ans[i]);
86     return 0;
87 }

 

posted @ 2019-09-17 22:25  Klaier  阅读(128)  评论(0编辑  收藏  举报