hdu4912

嘛,比较恶心....

关键在于一个贪心思想....

对 没错   是贪心思想...

 

直接根据lca的深度排序

然后发现lca深度大的对深度小的影响...

然后就没有了

#include<bits/stdc++.h>
#define MAXN 100015
using namespace std;

//希望选择最多条路径,并且任何两个路径都不共享公共顶点。
int n,m,tot,ans;
int dep[MAXN],f[25][MAXN],h[MAXN]; 
bool judge[MAXN];

struct node{
    int from,to,next;
}e[MAXN<<1];

struct node2{
    int u,v,la;
}q[MAXN<<1];

void init(){
    tot=ans=0;
    memset(judge,false,sizeof(judge));
    memset(f,0,sizeof(f));
    memset(dep,0,sizeof(dep));
    memset(h,-1,sizeof(h));
}

void add(int x,int y){
    tot++;
    e[tot].from=x;
    e[tot].to=y;
    e[tot].next=h[x];
    h[x]=tot;
}

int dfs(int now,int fa){
    dep[now]=dep[fa]+1;
    for(int i=h[now];i!=(-1);i=e[i].next){
        if(e[i].to!=fa){
            f[0][e[i].to]=now;
            dfs(e[i].to,now);
        }
    }
}

void ycl(){
    for(int i=1;i<=20;i++){
        for(int j=1;j<=n;j++){
            f[i][j]=f[i-1][f[i-1][j]];
        }
    }
}

int lca(int x,int y){
    if(dep[x]<dep[y])swap(x,y);
    int dx=dep[x]-dep[y];
    for(int i=0;i<=20;i++){
        if(dx&(1<<i)){
            x=f[i][x];
        }
    }
    if(x==y)return x;
    for(int i=20;i>=0;i--){
        if(f[i][x]!=f[i][y]){
            x=f[i][x];
            y=f[i][y];
        }
    }
    return f[0][x];
}

bool cmp(node2 x,node2 y){
    return dep[x.la]>dep[y.la];
}

int dfs2(int now){
    judge[now]=true;
    for(int i=h[now];i!=(-1);i=e[i].next){
        if(f[0][now]!=e[i].to&&judge[e[i].to]==false){
            dfs2(e[i].to);
        }
    }
}

int main(){
    while(scanf("%d%d",&n,&m)==2){
    init();
    for(int i=1;i<n;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    dfs(1,1);
    ycl();
    for(int i=1;i<=m;i++){
        cin>>q[i].u>>q[i].v;
        q[i].la=lca(q[i].u,q[i].v);
    }
    sort(q+1,q+1+m,cmp);
        for(int i=1;i<=m;i++){
            if(judge[q[i].u]==true||judge[q[i].v]==true)continue;
            dfs2(q[i].la);
            ans++;
        }
        cout<<ans<<endl;
    }
    
}
View Code

 

posted @ 2020-02-14 16:51  After_rain  阅读(120)  评论(0)    收藏  举报