图论之离线lca模板

来源:互联网 发布:sql注入 预处理 编辑:程序博客网 时间:2024/06/05 06:09
#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;#define MEM(a,b) memset(a,b,sizeof(a));const int N=100010;int n,m;struct Edge{    int u,v,w,next;}edge[2*N],Q[N];int fa[N],dis[N];bool vis[N];int cnt,qcnt;int head[N],qhead[N];void addedge(int u,int v,int w){    edge[cnt].u=u;edge[cnt].v=v;edge[cnt].w=w;edge[cnt].next=head[u];    head[u]=cnt++;}void addQ(int u,int v){    Q[qcnt].v=v;Q[qcnt].next=qhead[u];qhead[u]=qcnt++;}void tarjan(int x){    fa[x]=x;    vis[x]=1;    for(int i=head[x];i!=-1;i=edge[i].next){        int v=edge[i].v;        if(!vis[v]){            dis[v]=dis[x]+edge[i].w;            tarjan(v);            fa[v]=x;//向上合并        }    }    for(int i=qhead[x];i!=-1;i=Q[i].next){        int v=Q[i].v;        if(vis[v]){            Q[i].w=dis[x]+dis[v]-2*dis[root(v)];            Q[i^1].w=Q[i].w;        }    }}int main(){    cnt=0;qcnt=0;    memset(head, -1, sizeof(head));    memset(qhead, -1, sizeof(qhead));    memset(vis,0,sizeof(vis));    memset(dis,0,sizeof(dis));    memset(fa,-1,sizeof(fa));        tarjan(1);        return 0;}

0 0