题解【洛谷P1967】[NOIP2013]货车运输
题解
注意到有一些限重很低的边不会被走到。
于是考虑建一棵最大生成树,在生成树上寻找答案。
设\(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]货车运输的更多相关文章
- 【题解】【洛谷 P1967】 货车运输
目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...
- 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)
洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...
- 洛谷P1967 [NOIP2013提高组Day1T2]货车运输
P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...
- [luogu P1967][NOIp2013] 货车运输
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- 【洛谷1967】货车运输(最大生成树+倍增LCA)
点此看题面 大致题意: 有\(n\)个城市和\(m\)条道路,每条道路有一个限重.多组询问,每次询问从\(x\)到\(y\)的最大载重为多少. 一个贪心的想法 首先,让我们来贪心一波. 由于要求最大载 ...
- 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
[洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...
- 洛谷 P1967 货车运输
洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...
- 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增
倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...
- [Luogu 1967] NOIP2013 货车运输
[Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...
- NOIP2013 货车运输(最大生成树,倍增)
NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...
随机推荐
- PHP-CMS代码审计(4)
这次找了个发卡平台,url: https://files.cnblogs.com/files/b1gstar/kamiphp.zip 从52破解上下载的 : 先把网站搭建起来. 网站没有采用mvc框 ...
- element-ui 和ivew-ui的table导出export纯前端(可用)
一.element-ui 1.安装依赖Element组件库中的el-table表格导出需要的主要是两个依赖:(xlsx 和 file-saver) npm install --save xlsx fi ...
- Java代码操作Elasticsearch
创建maven项目,导入依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</a ...
- shell awk学习3
需求: 某文件aa的内容如下: a/p1/p2b/pp1c/ppp1/ppp3d/p1/p2/p3e/p1/p2/p3/p4 期望输出结果: a /p1 /p2 b /pp1 c /ppp1 /ppp ...
- P6070 [RC-02] GCD [杜教筛,莫比乌斯反演]
没啥好说的,杜教筛板子题. \[\sum_{i=1}^{N} \sum_{j=1}^{N}\sum_{p=1}^{\lfloor \frac{N}{j} \rfloor}\sum_{q=1}^{\lf ...
- php外挂python脚本抓取ajax数据
之前我写过一遍php外挂python脚本处理视频的文章.今天和大家分享下php外挂python实现输入关键字搜索的脚本 首先我们先来分析一波网站: http://www.dzdpw.com/s.php ...
- gulp常用插件之bower使用
更多gulp常用插件使用请访问:gulp常用插件汇总 bower这是一款客户端技术的软件包管理器,它可用于搜索.安装和卸载如JavaScript.HTML.CSS之类的网络资源. 更多使用文档请点击访 ...
- simon effect (psychology experiment ) : build the function of wait4key()
## #the real experiment for simon effect #load the library which is our need import pygame import sy ...
- js数据类型1
1. 分类(2大类) 基本(值)类型--5种 Number: 任意数值 String: 任意文本 Boolean: true/false undefined: undefined null: null ...
- 小白的java学习之路 “ 带参数的方法”
一.带参数的方法: 1.1 语法: <访问修饰符> 返回类型 <方法名>(<形式参数列表>) { //方法的主体 } 1.2 案例: 榨汁机 public clas ...