HDU-2017"百度之星"程序设计大赛-初赛(B)-1002-Factory
程序员文章站
2022-07-03 18:15:13
...
描述
题解
其实,这个题的题解我是秒出的,当然,之所以没有写是因为这个秒出的题解也是被我秒掉了,我认识他会超时……始终是这样认为的……可是大概数据没有那么刁钻的极限情况,所以直接
我们只需要暴力枚举两个子公司的办公室的任意组合,求最短距离即可,这部分就是
比赛中,最可怕的就是模版题你搞炸了……然而这次的题,两道题都是模版题,并且还都炸了,
代码
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
const int MAXN = 100010;
const int INF = 0x3f3f3f3f;
const int MAGIC = 20;
struct edge
{
int x, w;
edge(int x, int w) : x(x), w(w) {}
};
vector<edge> ve[MAXN];
vector<int> vi[MAXN];
int n, m;
int dep[MAXN];
int hed[MAXN];
int pre[MAXN][MAGIC];
void dfs(int x, int p)
{
hed[x] = hed[p] + 1;
pre[x][0] = p;
for (int i = 1; i < MAGIC; ++i)
{
pre[x][i] = pre[pre[x][i - 1]][i - 1];
}
int y;
for (int i = 0; i < ve[x].size(); ++i)
{
y = ve[x][i].x;
if (y == p)
{
continue;
}
dep[y] = dep[x] + ve[x][i].w;
dfs(y, x);
}
}
int lca(int x, int y)
{
if (hed[x] < hed[y])
{
swap(x, y);
}
int d = hed[x] - hed[y];
for (int i = 0; i < MAGIC; ++i)
{
if ((d >> i) & 1)
{
x = pre[x][i];
}
}
if (x == y)
{
return x;
}
for (int i = MAGIC - 1; i >= 0; --i)
{
if (pre[x][i] != pre[y][i])
{
x = pre[x][i];
y = pre[y][i];
}
}
return pre[x][0];
}
template <class T>
inline void scan_d(T &ret)
{
char c;
ret = 0;
while ((c = getchar()) < '0' || c > '9');
while (c >= '0' && c <= '9')
{
ret = ret * 10 + (c - '0'), c = getchar();
}
}
int main()
{
int T;
scan_d(T);
while (T--)
{
scan_d(n), scan_d(m);
for (int i = 1; i <= n; ++i)
{
ve[i].clear();
}
for (int i = 1; i <= m; ++i)
{
vi[i].clear();
}
int u, v, w;
for (int i = 1; i < n; ++i)
{
scan_d(u), scan_d(v), scan_d(w);
ve[u].push_back(edge(v, w));
ve[v].push_back(edge(u, w));
}
int G, x;
for (int i = 1; i <= m; ++i)
{
scan_d(G);
for (int j = 0; j < G; ++j)
{
scan_d(x);
vi[i].push_back(x);
}
}
dfs(1, 0);
int Q, ans;
scan_d(Q);
while (Q--)
{
scanf("%d%d", &u, &v);
ans = INF;
for (auto x : vi[u])
{
for (auto y : vi[v])
{
ans = min(ans, dep[x] + dep[y] - 2 * dep[lca(x, y)]);
}
}
printf("%d\n", ans);
}
}
return 0;
}
推荐阅读
-
HDU-2017"百度之星"程序设计大赛-初赛(B)-1001-Chess
-
2018 “百度之星”程序设计大赛 - 初赛(B)-1001 degree
-
HDU-2017"百度之星"程序设计大赛-初赛(B)-1002-Factory
-
1001 Discount (数学 / 优惠率) (2020年百度之星*程序设计大赛-初赛三)
-
1003. Covid (思维 / 小根堆)(2020年百度之星*程序设计大赛-初赛二)
-
2018 “百度之星”程序设计大赛 - 初赛(A)1002-度度熊学队列
-
2018百度之星程序设计大赛初赛B——1002hex
-
2020 年百度之星·程序设计大赛 - 初赛三 P1005 Chess (HDU 6787) dp
-
2020 年百度之星·程序设计大赛 - 初赛三 P1005 Chess (HDU 6787) dp