hdu 4912 Paths on the tree(树链拆分+贪婪)

hdu 4912 Paths on the tree(树链拆分+贪婪)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

题目链接:hdu 4912 Paths on the tree

题目大意:给定一棵树,和若干个通道。要求尽量选出多的通道,而且两两通道不想交。

解题思路:用树链剖分求LCA,然后依据通道两端节点的LCA深度排序,从深度最大优先选。推断两个节点均没被标

记即为可选通道。

每次选完通道。将该通道LCA下面点所有标记。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 1e5 + 5;

int N, M, E, first[maxn], jump[maxn * 2], link[maxn * 2], vis[maxn];
int id, idx[maxn], top[maxn], far[maxn], son[maxn], cnt[maxn], dep[maxn];

inline void add_Edge (int u, int v) {
    link[E] = v;
    jump[E] = first[u];
    first[u] = E++;
}

void dfs (int u, int pre, int d) {
    far[u] = pre;
    son[u] = 0;
    cnt[u] = 1;
    dep[u] = d;
    for (int i = first[u]; i + 1; i = jump[i]) {
        int v = link[i];
        if (v == pre)
            continue;
        dfs(v, u, d + 1);
        cnt[u] += cnt[v];
        if (cnt[son[u]] < cnt[v])
            son[u] = v;
    }
}

void dfs (int u, int rot) {
    top[u] = rot;
    idx[u] = ++id;
    if (son[u])
        dfs(son[u], rot);
    for (int i = first[u]; i + 1; i = jump[i]) {
        int v = link[i];
        if (v == far[u] || v == son[u])
            continue;
        dfs(v, v);
    }
}

void dfs (int u) {
    if (vis[u])
        return;
    vis[u] = 1;
    for (int i = first[u]; i + 1; i = jump[i]) {
        int v = link[i];
        if (v == far[u])
            continue;
        dfs(v);
    }
}

struct query {
    int u, v, r, d;
    void set(int u, int v, int r, int d) {
        this->u = u;
        this->v = v;
        this->r = r;
        this->d = d;
    }
    friend bool operator < (const query& a, const query& b) {
        return a.d > b.d;
    }
}q[maxn];

int LCA (int u, int v) {
    int p = top[u], q = top[v];
    while (p != q) {
        if (dep[p] < dep[q]) {
            swap(p, q);
            swap(u, v);
        }
        u = far[p];
        p = top[u];
    }
    return dep[u] < dep[v] ? u : v;
}

void init () {
    E = id = 0;
    memset(first, -1, sizeof(first));

    int u, v;
    for (int i = 1; i < N; i++) {
        scanf("%d%d", &u, &v);
        add_Edge(u, v);
        add_Edge(v, u);
    }
    dfs(1, 0, 0);
    dfs(1, 1);

    for (int i = 0; i < M; i++) {
        scanf("%d%d", &u, &v);
        int rot = LCA(u, v);
        q[i].set(u, v, rot, dep[rot]);
    }
    sort(q, q + M);
}

int main () {
    while (scanf("%d%d", &N, &M) == 2) {
        init();

        int ans = 0;
        memset(vis, 0, sizeof(vis));
        for (int i = 0; i < M; i++) {
            if (vis[q[i].u] || vis[q[i].v])
                continue;
            dfs(q[i].r);
            ans++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117453.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • k8s pod控制器_k8s控制器

    k8s pod控制器_k8s控制器k8sPod控制器的介绍ReplicaSet(RS)Deployment(Deploy)扩缩容镜像更新版本回退金丝雀发布Horizontal Pod Autoscaler(HPA)DaemonSet(DS)JobCronJob(CJ)StatefulSet(有状态)StatefulSet的金丝雀发布k8s的Pod控制器详解主要介绍各种Pod控制器的详细使用。Pod控制器的介绍在kubernetes中,按照Pod的创建方式可以将其分为两类:自主式Pod:kubernetes直接创建出来的Pod,这

    2022年8月11日
    9
  • 卡盟销售官网源码php,卡盟整站程序源码 php版「建议收藏」

    卡盟销售官网源码php,卡盟整站程序源码 php版「建议收藏」卡盟整站源码是该网站的内核程序,内核是Ecshop,类似平台开钻之类整站程序,也是重要的源码文件,其中包含了各种源码类型文件,比较全,安装操作比较简单。卡盟整站源码是一个点卡销售/充值平台程序,可以开钻,自动发货点卡,充值点卡,充值QB,如果自己想搭建卡盟的朋友可以下载使用。卡盟整站程序源码功能模块介绍系统公告、行业新闻、帮助信息、网址导航、用户注册,购卡中心。后台可以进行商品管理、订单管理、用户…

    2022年8月12日
    7
  • UE4 slate_ue4渲染动画

    UE4 slate_ue4渲染动画原创文章,转载请注明出处。点击观看下一篇《UE4Slate二用UMG思想去理解Slate》这里写目录标题前言Slate是什么?为什么要了解Slate?提前需要了解的模块(将对Slate学习很有帮助)前言Slate相关文章,使用引擎版本4.25.4源码版.一共11篇文章。网上Slate的文章介绍很少,所以在这里做一下该部分的文章并记录一下。同时也希望能帮助到大家。Slate是什么?一套GUI架构,它是虚幻引擎的UI架构。我们打开编辑器看到的界面,可以说95%以上(高概猜测数值,甚至100.

    2022年10月4日
    5
  • 比特每秒bps,2Mbps=256kbit下载速度转换算法。

    比特每秒bps,2Mbps=256kbit下载速度转换算法。

    2021年8月19日
    78
  • TypeScript超详细入门教程(上)「建议收藏」

    TypeScript超详细入门教程(上)「建议收藏」TypeScript超详细入门教程(上) 01开篇词:Hello~TypeScript01开篇词:Hello~TypeScript更新时间:2019-10-3013:49:46 既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。——康德 同学你好,我是Lison。很高兴你对TypeScript感兴趣,或许你对TypeScrip…

    2025年7月3日
    5
  • 亚马逊记AWS(Amazon Web Services)自由EC2应用

    亚马逊记AWS(Amazon Web Services)自由EC2应用

    2022年1月8日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号