# NOIP2015 运输计划

### 题目描述

L 国有 n 个星球，还有 n−1 条双向航道，每条航道建立在两个星球之间，这 n−1 条航道连通了 L 国的所有星球。

### 输出格式

#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 day2t3 运输计划

• RecLxf
• 2015年12月06日 17:22
• 1950

## 【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
• 2016年09月09日 20:34
• 1467

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

• sdfzyhx
• 2016年10月28日 17:27
• 485

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

• CHN_JZ
• 2017年10月12日 20:12
• 553

举报原因： 您举报文章：NOIP2015 运输计划 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)