工具
1.函数绘图
2.图片格式在线转换
摸鱼
1.小黑屋
2.进化
3.名字竞技场
模板
(1.Tarjan)&(LCA)
#include<bits/stdc++.h>
#define N 500010
using namespace std;
struct NODE{
int next,to,lca;
};
NODE edge[N<<1],qedge[N<<1];
int n,m,p,x,y;
int num_edge,num_qedge,head[N],qhead[N],father[N],visit[N];
inline void add_edge(int,int);
inline void add_qedge(int,int);
int Find(int);
void DFS(int);
int main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<n;++i)
{
scanf("%d%d",&x,&y);
add_edge(x,y);
add_edge(y,x);
}
for(int i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
add_qedge(x,y);
add_qedge(y,x);
}
DFS(p);
for(int i=1;i<=m;i++)
printf("%d
",qedge[i*2].lca);
return 0;
}
inline void add_edge(int from,int to)
{
edge[++num_edge].next=head[from];
edge[num_edge].to=to;
head[from]=num_edge;
}
inline void add_qedge(int from,int to)
{
qedge[++num_qedge].next=qhead[from];
qedge[num_qedge].to=to;
qhead[from]=num_qedge;
}
int Find(int z)
{
if(father[z]!=z)
father[z]=Find(father[z]);
return father[z];
}
void DFS(int x)
{
father[x]=x;
visit[x]=1;
for(int k=head[x];k;k=edge[k].next)
if(!visit[edge[k].to])
{
DFS(edge[k].to);
father[edge[k].to]=x;
}
for(int k=qhead[x];k;k=qedge[k].next)
if(visit[qedge[k].to])
{
qedge[k].lca=Find(qedge[k].to);
(k%2)?qedge[k+1].lca=qedge[k].lca:qedge[k-1].lca=qedge[k].lca;
}
}
2.快速幂