您的位置:首页 > 其它

图论之离线lca模板

2015-07-18 14:05 399 查看
#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
;

int fa
,dis
;
bool vis
;

int cnt,qcnt;
int head
,qhead
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: