NOIP2015 运输计划
2015-11-20 10:59
323 查看
传送门
L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球。
小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之间不会产生任何干扰。
为了鼓励科技创新, L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。
在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后,这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的物流公司的阶段性工作就完成了。
如果小 P 可以自由选择将哪一条航道改造成虫洞, 试求出小 P 的物流公司完成阶段性工作所需要的最短时间是多少?
接下来 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
考试的时候写跪了,感觉药丸……这道题有一种可行的思路是二分答案。
我们首先要预处理出来每一条路径的长度。二分答案的时候检查是否有路径的长度大于Ans(二分的答案),就记录下来其中最大的一条的长度,然后标记下来这种路径的每一条边的。然后扫描所有的路径,如果有一条边能让所有超过Ans的路径都变得小于等于Ans了,那么这个答案就是合法的。
代码:
题目描述
公元 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; }
相关文章推荐
- JS中页面加载事件window.onload、onload()、document.onclick
- 图像的深度和通道
- 敏捷开发 - 敏捷工具
- Android开发之多层树型目录的实现
- Nginx安装部署
- Swift 2.0 学习第2天: 基 4000 本操作符
- c++STL 中的copy函数
- DEF2015丨腾讯优测携专业云测试服务,亮相中国(成都)数字娱乐节
- NameNode运行原理浅析
- jquery array remove duplicate records
- Android 4K高清图片解码显示(1)安卓内存分析
- 常用Oracle分析函数详解
- linux 下安装mysql
- BroadcastReceiver的分类【转】
- JS的运行机制
- Spring的ApplicationEvent的使用
- struts2+spring+ibatis配置 学习笔记
- 3D数学基础图形与游戏开发之坐标系
- 《Windows 程序设计(第五版,珍藏版)》第I部分 基础知识 学习总结
- [原]8小时外实践系列之二——比Office Word更出色的印刷级文字工具: LaTex