zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    [转]用正则表达式限制文本框只能输入数字,小数点,英文字母,汉字等各类代码
    xp_cmdshell开启与关闭
    [转]触发器
    上午绿茶下午菊花茶晚上枸杞
    SQL中CONVERT转化日期函数的使用方法
    如何使用url实现数据交互
    struts2之form标签theme属性详解
    [保险核心] 保险公司集中收付费系统
    数据库分页大全
    如何使用spring中hibernate返回获取list集合
  • 原文地址:https://www.cnblogs.com/shatianming/p/12307991.html
Copyright © 2011-2022 走看看