工具小仓

工具

1.函数绘图

2.图片格式在线转换

3.随机东方壁纸API

摸鱼

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.快速幂

原文地址:https://www.cnblogs.com/Dr-Albert-Wensley/p/URL.html