题解【洛谷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 辆货车在运输货物,司机们想知道 ...
随机推荐
- C# MVC Api无法获得参数
在MVC中写API时,没有收到参数如何解决? 通过jQuery.POST测试成功.后来又通过F12发送,发现始终无法收到参数. 注:我的接口接收参数是一个类对象,没有写[FromBody]) [Htt ...
- matlab仿真随机数的产生
概率论和数理统计实验(matlab中实现) 一.伯努利分布 R=binornd(N,P); //N,P为二次分布的俩个参数,返回服从参数为N,P的二项分布的随机数,且N,P,R的形式相同. R=bin ...
- 简单CSS的应用
今天主要学习了一些关于CSS的内容 通过css调试了一个简单的表格 <%@ page language="java" contentType="text/html; ...
- LeetCode 867. 转置矩阵
题目链接:https://leetcode-cn.com/problems/transpose-matrix/ 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵 ...
- Wannafly Winter Camp 2020 Day 7D 方阵的行列式 - 数学
于是去弄了个板子来 #include <bits/stdc++.h> using namespace std; #define int long long const int mod = ...
- PHP0006:PHP基础--函数2
如果php后面没有任何html代码就可以 删掉后面的 ?> 符号 file_put_content 是覆盖写入文件信息
- JS DOM操作(创建、遍历、获取、操作、删除节点)
创建节点 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="u ...
- LINUX 概述
初识linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协 ...
- Python安装1 —— Python3.8的安装
本文内容皆为作者原创,如需转载,请注明出处:https://www.cnblogs.com/xuexianqi/p/12377746.html 一:什么是Python解释器 解释器(英语:Interp ...
- One CLI for webpack must be installed. These are recommended choices, delivered as separate packages:
C:\Users\arn>webpack -v One CLI for webpack must be installed. These are recommended choices, del ...