noip 2013 P1967 货车运输

倍增求LCA时避免父亲倍增数组出现0,倍增记录最小值时,简单写法

    int now=0;
    for (int i=1;i<=n;i++)
    {
        if (vi[i]!=0)
          continue;
        now++;
        dfs(i,0,0,inf,now);
        f[i][0]=i;//使当前的father==i
        chmin[i][0]=inf;//记录的最小值
    }

求deep时,注意不是求距离上的deep,而是层数

void dfs(int x,int father,int deep,int last,int visit)
{
    de[x]=deep;
    vi[x]=visit;
    f[x][0]=father;
    chmin[x][0]=last;
    for (int i=first[x];i!=-1;i=nxt[i])
    {
        if (point[i]!=father)
        {
            dfs(point[i],x,deep+1,len[i],visit);//deep是+1,不是加len[i],注意
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/huangchenyan/p/11128841.html