题面

题解

注意到有一些限重很低的边不会被走到。

于是考虑建一棵最大生成树,在生成树上寻找答案。

设\(f[i][j]\)表示\(i\)的\(2^j\)级祖先,\(w[i][j]\)表示\(i\)到\(2^j\)级祖先的最大载重。

那么我们在倍增寻找\(\text{LCA}\)时更新答案即可。

代码

#include <bits/stdc++.h>
#define itn int
#define gI gi using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + (c ^ 48), c = getchar();
return f * x;
} const int maxn = 100003; int q, n, m, tot, head[maxn], ver[maxn], edge[maxn], nxt[maxn], fa[maxn][23];
int f[maxn], w[maxn][23], vis[maxn], dep[maxn];
struct Node
{
int u, v, w;
} e[maxn]; inline bool cmp(Node x, Node y) {return x.w > y.w;} int getf(int u)
{
if (f[u] == u) return u;
return f[u] = getf(f[u]);
} inline void add(int u, int v, int w)
{
ver[++tot] = v, nxt[tot] = head[u], edge[tot] = w, head[u] = tot;
} inline void get_MST()
{
for (int i = 1; i <= n; i+=1) f[i] = i;
for (int i = 1; i <= m; i+=1)
{
int U = getf(e[i].u), V = getf(e[i].v);
if (U != V)
{
f[U] = V;
add(e[i].u, e[i].v, e[i].w);
add(e[i].v, e[i].u, e[i].w);
}
}
} void dfs(int u)
{
vis[u] = 1;
for (int i = head[u]; i; i = nxt[i])
{
int v = ver[i], ww = edge[i];
if (vis[v]) continue;
dep[v] = dep[u] + 1;
fa[v][0] = u;
w[v][0] = ww;
dfs(v);
}
} inline int getans(int u, int v)
{
if (dep[u] > dep[v]) swap(u, v);
int uu = 0x3f3f3f3f;
for (int i = 20; i >= 0; i-=1)
{
if (dep[fa[v][i]] >= dep[u]) uu = min(uu, w[v][i]), v = fa[v][i];
}
if (u == v) return uu;
for (int i = 20; i >= 0; i-=1)
{
if (fa[u][i] != fa[v][i])
{
uu = min(uu, min(w[u][i], w[v][i]));
u = fa[u][i], v = fa[v][i];
}
}
uu = min(uu, min(w[u][0], w[v][0]));
return uu;
} int main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
n = gi(), m = gi();
for (int i = 1; i <= m; i+=1)
{
int u = gi(), v = gi(), w = gi();
e[i].u = u, e[i].v = v, e[i].w = w;
}
sort(e + 1, e + 1 + m, cmp);
get_MST();
for (int i = 1; i <= n; i+=1)
{
if (!vis[i])
{
dep[i] = 1;
dfs(i);
fa[i][0] = i;
w[i][0] = 0x3f3f3f3f;
}
}
for (int i = 1; i <= 20; i+=1)
for (int j = 1; j <= n; j+=1)
fa[j][i] = fa[fa[j][i - 1]][i - 1],
w[j][i] = min(w[j][i - 1], w[fa[j][i - 1]][i - 1]);
q = gi();
while (q--)
{
int u = gi(), v = gi();
if (getf(u) != getf(v)) {puts("-1"); continue;}
printf("%d\n", getans(u, v));
}
return 0;
}

题解【洛谷P1967】[NOIP2013]货车运输的更多相关文章

  1. 【题解】【洛谷 P1967】 货车运输

    目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...

  2. 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)

    洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...

  3. 洛谷P1967 [NOIP2013提高组Day1T2]货车运输

    P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...

  4. [luogu P1967][NOIp2013] 货车运输

    题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...

  5. 【洛谷1967】货车运输(最大生成树+倍增LCA)

    点此看题面 大致题意: 有\(n\)个城市和\(m\)条道路,每条道路有一个限重.多组询问,每次询问从\(x\)到\(y\)的最大载重为多少. 一个贪心的想法 首先,让我们来贪心一波. 由于要求最大载 ...

  6. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  7. 洛谷 P1967 货车运输

    洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...

  8. 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增

    倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...

  9. [Luogu 1967] NOIP2013 货车运输

    [Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...

  10. NOIP2013 货车运输(最大生成树,倍增)

    NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...

随机推荐

  1. 【第二篇】xLua中lua加载方式

     xLua中lua文件加载方式 1. 直接执行字符串方式 LuaEnv luaenv = new LuaEnv(); luaenv.DoString("CS.UnityEngine.Debu ...

  2. 卸载软件后,win10应用与功能中仍有残留,解决方案。

    这个问题我已经找到解决办法了,首先打开“应用和功能”列表, 然后往下拉看到“相关设置”打开其中的“程序和功能”一项, 然后找出你想删除的应用进行卸载.

  3. 刷题79. Word Search

    一.题目说明 题目79. Word Search,给定一个由字符组成的矩阵,从矩阵中查找一个字符串是否存在.可以连续横.纵找.不能重复使用,难度是Medium. 二.我的解答 惭愧,我写了很久总是有问 ...

  4. clientHeight offsetTop scrollTop

  5. cf1214E

    题意简述:构造一棵包含2*n个节点的树,要求2*i 和 2*i-1之间的距离等于d[i]<=n 1<=i<=n 给出N和d数组,输入对应的边 题解:对d数组按照从大到小排序,然后首先 ...

  6. kali安装后中文乱码

    参考: 文章一:https://blog.csdn.net/dust_hk/article/details/103299136?depth_1-utm_source=distribute.pc_rel ...

  7. MySQL 8 重置 root 密码

    如果 root 密码丢失,如何重置 root 密码? 重置 root 密码:Unix 和 类 Unix 系统: 1.登录 Unix 系统用户(运行MySQL服务器的用户) 2.停止MySQL服务器   ...

  8. MyBatis的延迟加载和缓存机制

    延迟加载: 什么是延迟加载: MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力. MyBatis根据对 ...

  9. LeetCode30 Hard 查找所有子串

    本文始发于个人公众号:TechFlow,原创不易,求个关注 链接 Substring with Concatenation of All Words 难度 Hard 描述 给定一个字符串s作为母串,和 ...

  10. Java8新特性一览表

    总览 forEach() method in Iterable interface(Iterable接口中的forEach()方法) default and static methods in Int ...