树链剖分边权版

int tol,head[maxn];
struct edge
{
    int to,next;
}es[maxm];
void addedge( int u , int v )
{
    es[tol].to = v;
    es[tol].next = head[u];
    head[u] = tol++;
}
int top[maxn],fa[maxn],dep[maxn],sizes[maxn],tid[maxn],rk[maxn],wson[maxn],num;
void init()
{
    tol = 0;
    memset ( head , -1 , sizeof(head) );
    num = 0;
    memset ( wson , -1 , sizeof(wson) );
}
void dfs1( int u , int f , int d )
{
    dep[u] = d,fa[u] = f,sizes[u] = 1;
    for ( int i=head[u] ; i!=-1 ; i=es[i].next )
    {
        int v = es[i].to;
        if ( v!=f )
        {
            dfs1 ( v , u , d+1 );
            sizes[u] += sizes[v];
            if ( wson[u]==-1||sizes[v]>sizes[wson[u]] )
                wson[u] = v;
        }
    }
}
void dfs2( int u , int tp )
{
    top[u] = tp,tid[u] = ++num,rk[tid[u]] = u;
    if ( wson[u]==-1 ) return;
    dfs2( wson[u] , tp );
    for ( int i=head[u] ; i!=-1 ; i=es[i].next )
        if ( es[i].to!=fa[u]&&es[i].to!=wson[u] ) dfs2( es[i].to , es[i].to );
}
dfs1( 1 , 0 , 1 );
dfs2( 1 , 1 );
for ( int i=2 ; i<=n ; i++ )
{
    if ( dep[u[i]]<dep[v[i]] ) swap ( u[i] , v[i] );
    val[u[i]] = w[i];
}
void Change( int u , int v )
{
    while ( top[u]!=top[v] )
    {
        if ( dep[top[u]]<dep[top[v]] ) swap ( u , v );
        Update( tid[top[u]] , tid[u] , 2 , n , 1 );
        u = fa[top[u]];
    }
    if ( dep[u]>dep[v] ) swap ( u , v );
    Update( tid[u]+1 , tid[v] , 2 , n , 1 );
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值