poj3417 暗的连锁

Posted duojiaming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj3417 暗的连锁相关的知识,希望对你有一定的参考价值。

技术图片

 


主体还是求lca啦

看代码

#include<iostream>
using namespace std;
const int mxn=1e5+5; 
int n,m;
int f[mxn][30],w[mxn*5],d[mxn];
struct vec{
    int nxt,to;
}g[2*mxn];
int first[mxn],len;
void add(int x,int y){
    g[++len].to=y;
    g[len].nxt=first[x];
    first[x]=len;
}
void pre(int u,int fa){
    d[u]=d[fa]+1;
    for(int i=1;i<=19;i++){
        f[u][i]=f[f[u][i-1]][i-1]; 
    }
    for(int i=first[u];i;i=g[i].nxt){
        int v=g[i].to;
        if(v!=fa){
            f[v][0]=u;
            pre(v,u);
        }
    }
}
int lca(int x,int y){
    if(d[x]<d[y]){
        swap(x,y);
    }
    for(int i=19;i>=0;i--){
        if(d[f[x][i]]>=d[y]){
            x=f[x][i];
        }
        if(x==y){
            return x;
        }
    }
    for(int i=19;i>=0;i--){
        if(f[x][i]!=f[y][i]){
            x=f[x][i];
            y=f[y][i];
        } 
    }
    return f[x][0];
}
void dfs(int u,int fa){
    for(int i=first[u];i;i=g[i].nxt){
        int v=g[i].to;
        if(v!=fa){
            dfs(v,u);
            w[u]+=w[v];
        }
    }
}
int ans=0;
int main(){
    cin>>n>>m;
    int a,b;
    for(int i=1;i<n;i++){
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
    }
    pre(1,0);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&a,&b);
        w[a]++;
        w[b]++;
        w[lca(a,b)]-=2;
    }
    dfs(1,0);
    for(int i=2;i<=n;i++){
        if(w[i]==1){
            ans++;
        }
        if(w[i]==0){
            ans+=m;
        }
    }
    cout<<ans;
    return 0;
}

 

以上是关于poj3417 暗的连锁的主要内容,如果未能解决你的问题,请参考以下文章

1553:例 2暗的连锁

一本通1553例 2暗的连锁

题解一本通1553:例 2暗的连锁

loj 10131 暗的连锁

poj3417 闇の連鎖 树上差分By cellur925

倍增法求lca:暗的连锁