NOIP2015 运输计划

原创 2015年11月20日 10:59:25

传送门

题目描述

公元 2044 年,人类进入了宇宙纪元。
L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球。
小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之间不会产生任何干扰。
为了鼓励科技创新, L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。
在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后,这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的物流公司的阶段性工作就完成了。
如果小 P 可以自由选择将哪一条航道改造成虫洞, 试求出小 P 的物流公司完成阶段性工作所需要的最短时间是多少?

输入格式

第一行包括两个正整数 n,m,表示 L 国中星球的数量及小 P 公司预接的运输计划的数量,星球从 1 到 n 编号。
接下来 n−1 行描述航道的建设情况,其中第 i 行包含三个整数 ai,bi 和 ti,表示第 i 条双向航道修建在 ai 与 bi 两个星球之间,任意飞船驶过它所花费的时间为 ti。数据保证 1≤ai,bi≤n 且 0≤ti≤1000。
接下来 m 行描述运输计划的情况,其中第 j 行包含两个正整数 uj 和 vj,表示第 j 个运输计划是从 uj 号星球飞往 vj号星球。数据保证 1≤ui,vi≤n

输出格式

输出文件只包含一个整数,表示小 P 的物流公司完成阶段性工作所需要的最短时间。

考试的时候写跪了,感觉药丸……这道题有一种可行的思路是二分答案。
我们首先要预处理出来每一条路径的长度。二分答案的时候检查是否有路径的长度大于Ans(二分的答案),就记录下来其中最大的一条的长度,然后标记下来这种路径的每一条边的。然后扫描所有的路径,如果有一条边能让所有超过Ans的路径都变得小于等于Ans了,那么这个答案就是合法的。

代码:

#include<cstdio>
#define MAXN 300005
char c;
inline void GET(int &n) {
    n = 0;
    do c = getchar(); while('0' > c || c > '9');
    while('0' <= c && c <= '9') {n = n*10 + c - '0'; c = getchar();}
}
inline int Max(int a, int b) {return a > b ? a : b;}
struct node {int v, w; node *nxt;}Edge[MAXN<<1], *Adj[MAXN], *M = Edge;
inline void Addedge(int u, int v, int w) {
    ++ M; M->v = v; M->w = w; M->nxt = Adj[u]; Adj[u] = M;
}
int q[MAXN], dcnt, to[MAXN];
int n, m, p[MAXN][3], Len[MAXN];
int sz[MAXN], htp[MAXN], hsn[MAXN];
int dep[MAXN], fa[MAXN], dis[MAXN];
void dfs1(int u) {
    sz[u] = 1; q[++ dcnt] = u;
    for(node *p = Adj[u]; p; p = p->nxt) {
        if(sz[p->v]) continue;
        dep[p->v] = dep[u] + 1; fa[p->v] = u;
        dis[p->v] = dis[u] + p->w; to[p->v] = p->w;
        dfs1(p->v);
        if(sz[p->v] > sz[hsn[u]]) hsn[u] = p->v;
        sz[u] += sz[p->v];
    }
}
void dfs2(int u, int tp)
{
    htp[u] = tp;
    for (node *p = Adj[u]; p; p = p->nxt)
        if (htp[p->v]) continue;
        else if (p->v != hsn[u])
            dfs2(p->v, p->v);
        else dfs2(p->v, tp);
}
int tmp;
inline void Swap(int &a, int &b) {tmp = a; a = b; b = tmp;}
inline int LCA(int a, int b) {
    while(htp[a] != htp[b]) {
        if(dep[htp[a]] < dep[htp[b]]) Swap(a, b);
        a = fa[htp[a]];
    }
    return dep[a] < dep[b] ? a : b;
}
int s[MAXN];
inline bool check(int mid) {
    int cnt = 0, lim = 0;
    for(int i = 1; i <= n; ++ i) s[i] = 0;
    for(int i = 1; i <= m; ++ i) if(Len[i] > mid) {
        ++ s[p[i][0]]; ++ s[p[i][1]];
        s[p[i][2]] -= 2;
        lim = Max(Len[i] - mid, lim);
        ++ cnt;
    }
    if(!cnt) return 1;
    for(int i = n; i > 1; -- i) s[fa[q[i]]] += s[q[i]];
    for(int i = 2; i <= n; ++ i)
        if(to[i] >= lim && s[i] == cnt) return 1;
    return 0;
}
int main()
{
    int u, v, w, l = 0, r = 0, mid, ans;
    GET(n); GET(m);
    for(int i = 1; i < n ; ++ i) {
        GET(u); GET(v); GET(w);
        Addedge(u, v, w);
        Addedge(v, u, w);
        r += w;
    }
    dfs1(1); dfs2(1, 1);
    for(int i = 1; i <= m; ++ i) {
        GET(p[i][0]); GET(p[i][1]);
        p[i][2] = LCA(p[i][0], p[i][1]);
        Len[i] = dis[p[i][0]]+dis[p[i][1]]-2*dis[p[i][2]];
    }
    while(l <= r) {
        mid = (l+r) >> 1;
        if(check(mid)) {ans = mid; r = mid-1;}
        else l = mid+1;
    }
    printf("%d\n", ans);
    return 0;
}
版权声明:转载时请标明原作者,谢谢

相关文章推荐

【NOIP2015】【BZOJ4326】运输计划

4326: NOIP2015 运输计划Time Limit: 20 Sec Memory Limit: 128 MB Submit: 30 Solved: 18 [Submit][Status...

【NOIP2015】运输计划 差分数组+线段树+树链剖分

最开始考NOIP的时候看到这个题目写了个SPFA,写搓了一分都没有,后来学了不少新姿势以后重新想起了这个题目据说倍增可以水60分,额,想了一想不知道怎么弄,于是我就开始写可以A的算法了,别人告诉我这个...

NOIP2015 day2t3 运输计划

公元 2044 年,人类进入了宇宙纪元。L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球。小 P 掌管一家物流公司, 该公司有很多...
  • RecLxf
  • RecLxf
  • 2015年12月06日 17:22
  • 1950

UOJ 150 [NOIP2015]运输计划

二分+树链剖分+差分要求最远的值最小,于是我们可以考虑二分答案。对于每一个二分出来的lim,我们只需要判断所有路径(指运输计划里面所有的路径)中长度大于lim的所有路径是否存在一条公共边,使得最长路径...

【uoj150】 NOIP2015—运输计划

http://uoj.ac/problem/150 (题目链接)题意:给出一棵树以及m个询问,可以将树上一条边的权值修改为0,求经过这样的修改之后最长的边最短是多少。Solution   老早就听说...

NOIP 2015 [D2 T3]运输计划

【NOIP2015 Day2】运输计划 Time Limit:20000MS  Memory Limit:262144K Total Submit:10 Accepted:7 Case Time...
  • getsum
  • getsum
  • 2016年09月09日 20:34
  • 1467

【NOIP2015】洛谷2680 运输计划【解法一】

二分答案+LCA
  • sdfzyhx
  • sdfzyhx
  • 2016年10月28日 17:27
  • 485

[bzoj4326][NOIP2015]运输计划

题目大意树上有许多条路径,现在你可以将一条边的权值设为0,令所有路径的最大值最小。最长路径瓶颈我们注意到,设为0的边如果不在最长路径上,就不会减小答案。 因此我们可以找出最长路径,把原树转化为一条链...

noip2015 运输计划

公元 2044 年,人类进入了宇宙纪元。L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球。小 P 掌管一家物流公司, 该公司有很多...

[二分+差分]BZOJ 4326——NOIP2015 运输计划

题目梗概给出一棵有边权的树,并有m个从x到y的路径。将一条边的边权改为0,使所有路径的最大值最小。解题思路因为要使最大值最小,所以我们二分答案。对于大于答案的路径,我们要修改它。那么就是把这些路径的交...
  • CHN_JZ
  • CHN_JZ
  • 2017年10月12日 20:12
  • 553
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NOIP2015 运输计划
举报原因:
原因补充:

(最多只允许输入30个字)