lca 离线模板

来源:互联网 发布:软件开发报价模板 编辑:程序博客网 时间:2024/06/06 07:08
struct node{int v,w;node(){}node(int vv,int ww){v=vv;w=ww;}};struct edge{int u,v,lca;edge(){}edge(int uu,int vv,int ll){u=uu,v=vv,lca=ll;}};vector<edge>G;vector<node>v[50000];vector<int>g[50000];int father[50000],rank1[50000];void addedge(int a,int b){G.push_back(edge(a,b,-1));G.push_back(edge(b,a,-1));int m=G.size();g[a].push_back(m-2);g[b].push_back(m-1);}int dir[50000];void init(int n){for(int i=0;i<=n;i++){father[i]=i;rank1[i]=0;}memset(dir,0,sizeof(dir));}int find(int a){if(a==father[a])return a;return father[a]=find(father[a]);}void unite(int x,int y){    x=find(x);    y=find(y);    if(x!=y)    father[y]=x;}int vis[50000];void tarjan(int x){    vis[x]=1;for(int i=0;i<v[x].size();i++){int y=v[x][i].v;if(vis[y])continue;dir[y]=dir[x]+v[x][i].w;tarjan(y);unite(x,y);}for(int i=0;i<g[x].size();i++){edge & y=G[g[x][i]];if(vis[y.v]){G[g[x][i]].lca=G[g[x][i]^1].lca=find(y.v);}}}ans=dir[u]+dir[v]-2*dir[lca];

原创粉丝点击