运输计划题解

理解题意

进过简单的分析,我们可以得出,题目想让我们求最小的最大值
首先,我们就直接想到了枚举,枚举在每一条边上建一个虫洞(也就是将这个边的边权变成0)枚举每个运输任务需要的时间(LCA实现)。最后求出所有航道中最大的值,当我们枚举完每条航道的时候,我们就可以直接得出答案。

对于不熟悉LCA的同学们给出LCA模板:

int lca(int u, int v)
{
    if (depth[u] < depth[v])
        swap(u, v);

    for (int i = LOG - 1; i >= 0; i--)
    {
        if (depth[st[u][i]] >= depth[v])
        {
            u = st[u][i];
        }
    }

    if (u == v)
        return u;

    for (int i = LOG - 1; i >= 0; i--)
    {
        if (st[u][i] != st[v][i])
        {
            u = st[u][i];
            v = st[v][i];
        }
    }

    return st[u][0];
}

其中 depth 表示深度。

but,我们小小的计算一下,我们就可以发现,这个枚举算法的时间复杂度高达:O(n^2),这种时间复杂度只能过8-10个点(40-50分)显然不是正解。(所以,正解是什么呢)

正解的思路是使用

没错,就是使用二分枚举。(虽然我不知道二分枚举是什么)

代码

没写呢,自己写去

2 个赞

用蔡老师写的笔记,不会自己写吗?

既然你慷慨的发了一篇题解,我也只好宣一下了: 题解:P2680 [NOIP 2015 提高组] 运输计划 - 洛谷专栏