博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XV Open Cup named after E.V. Pankratiev. GP of Central Europe (AMPPZ-2014)--J.Cave
阅读量:5424 次
发布时间:2019-06-15

本文共 1834 字,大约阅读时间需要 6 分钟。

给你一棵树,现在有m个专家,每个专家计划从$a_i$走到$b_i$, 经过的距离不超过$d_i$,现在让你找一个点,使得所有专家的路途都能经过这个点

令$S_i$表示满足第i个专家的所有点,先检查1可不可以,不行的话,找到离根最远的专家i,找$S_i$中最靠近根的那个点

 

#include 
using namespace std;#define rep(i, j, k) for (int i = int(j); i <= int(k); ++ i)typedef pair
P;const int N = 3e5 + 7;int n, m;vector
g[N];struct Requirement { int a, b, d;}req[N];int fa[N], dep[N];void dfs(int u, int f) { dep[u] = dep[f] + 1; fa[u] = f; for (int v: g[u]) if (v != f) dfs(v, u);}int main() { int T; scanf("%d", &T); while (T --) { scanf("%d%d", &n, &m); rep(i, 1, n) g[i].clear(); rep(i, 1, n - 1) { int x, y; scanf("%d%d", &x, &y); g[x].push_back(y); g[y].push_back(x); } rep(i, 1, m) { scanf("%d%d%d", &req[i].a, &req[i].b, &req[i].d); } auto calc = [&](int v, int i) -> int { return (dep[req[i].a] + dep[req[i].b] - req[i].d + 1) / 2; }; auto solve = [&]() -> int { dep[0] = -1; dfs(1, 0); int maxv = -1, t; rep(i, 1, m) { int d = calc(1, i); if (d > maxv) { maxv = d; t = i; } } if (maxv <= 0) return 1; int u = req[t].a; rep(i, 1, dep[req[t].a] - maxv) u = fa[u]; dfs(u, 0); maxv = -1; rep(i, 1, m) { int d = calc(u, i); if (d > maxv) maxv = d; } if (maxv <= 0) return u; return -1; }; int ans = solve(); if (ans < 0) printf("NIE\n"); else printf("TAK %d\n", ans); }}/*2 5 3 1 2 2 3 2 43 5 1 4 2 5 5 53 2 1*/

 

转载于:https://www.cnblogs.com/tempestT/p/10728077.html

你可能感兴趣的文章
iOS模拟器发生了崩溃,去哪找Crash Log
查看>>
[支付宝]即时到账接口对接总结
查看>>
夺命雷公狗-----React---15--三元运算符
查看>>
元首的愤怒 SharePoint Apps
查看>>
CSS
查看>>
两个DataGrid垂直滚动条同步滚动
查看>>
RPG的错排
查看>>
Java 7之基础 - 强引用、弱引用、软引用、虚引用
查看>>
位运算
查看>>
微软源代码管理工具TFS2013安装与使用图文教程
查看>>
JAVA中获取当前运行的类名,方法名,行数
查看>>
Nginx+PHP-FPM的域Socket配置方法
查看>>
集成通用Mapper
查看>>
SQL单表查询
查看>>
无服务器端的UDP群聊功能剖析 文章索引
查看>>
android studio 新建项目导入到Coding远程仓库git
查看>>
@bzoj - 4381@ [POI2015] Odwiedziny
查看>>
Pandas选择数据
查看>>
poj2411铺砖——状压DP
查看>>
python3 不知文件编码情况下打开文件代码记录
查看>>