题目描述:
A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。

每一条道路对车辆都有重量限制,简称限重。

现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。

输入格式
输入文件第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路。

接下来 m 行每行 3 个整数 x、y、z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z 的道路,注意:x 不等于 y,两座城市之间可能有多条道路。

接下来一行有一个整数 q,表示有 q 辆货车需要运货。

接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市 运输货物到 y 城市,注意:x 不等于 y。

输出格式
输出共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。

如果货车不能到达目的地,输出 −1。

数据范围
0<n<10000,
0<m<50000,
0<q<30000,
0≤z≤105
输入样例:

4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3

输出样例:

3
-1
3

思路:
克鲁斯卡尔求最大生成森林。
用add建树成功后。
用哈希表求出最大生成树数量,并以祖宗节点为根bfs。
之后常规套lca
代码:

// https://ac.nowcoder.com/acm/problem/16527#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<unordered_set>
using namespace std;
const int N = 1e5 + 10;
const int M = 5e5+10;
struct Edge
{int u, v, w;bool operator <(const Edge& t)const{return w > t.w;}
}edge[M];
int n, m;
int p[N];
int e[M], h[N], ne[M], w[M], idx = 0;
int g[N][20];
int fa[N][20];
int depth[N];
void add(int a, int b, int c)
{w[idx] = c;e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
int find(int x)
{if (x == p[x]){return x;}else{return p[x] = find(p[x]);}
}
void kruskal()
{for (int i = 1; i <= n; i++){p[i] = i;}for (int i = 0; i < m; i++){int u = edge[i].u;int v = edge[i].v;int a = find(u);int b = find(v);if (a != b){p[a] = b;add(u, v, edge[i].w);add(v, u, edge[i].w);}}
}
void bfs(int root)
{queue<int>q;q.push(root);depth[root] = 1;while (!q.empty()){int t = q.front();q.pop();for (int i = h[t]; i != -1; i = ne[i]){int j = e[i];if (depth[j] > depth[t] + 1){depth[j] = depth[t] + 1;fa[j][0] = t;g[j][0] = w[i];q.push(j);for (int k = 1; k < 20; k++){int anc = fa[j][k - 1];fa[j][k] = fa[anc][k - 1];g[j][k] = min(g[j][k - 1], g[anc][k - 1]);}}}}
}
int lca(int u, int v)
{int res = 1e9;if (depth[u] < depth[v]){swap(u, v);}for (int k = 19; k >= 0; k--){if (depth[fa[u][k]] >= depth[v]){res = min(res, g[u][k]);u = fa[u][k];}}if (u != v){for (int k = 19; k >= 0; k--){if (fa[u][k] != fa[v][k]){res = min(res, g[u][k]);res = min(res, g[v][k]);u = fa[u][k];v = fa[v][k];}}res = min(res, g[u][0]);res = min(res, g[v][0]);}return res;
}
unordered_set<int>S;
int main()
{memset(depth, 0x3f, sizeof depth);memset(g, 0x3f, sizeof g);depth[0] = 0;ios::sync_with_stdio(0); cin.tie(0);memset(h, -1, sizeof h);cin >> n >> m;for (int i = 0; i < m; i++){int a, b, c;cin >> a >> b >> c;edge[i] = { a,b,c };}sort(edge, edge + m);kruskal();for (int i = 1; i <= n; i++){int x = find(i);if (!S.count(x)){S.insert(x);}}unordered_set<int>::iterator P=S.begin();for (P; P != S.end(); P++){bfs(*P);}int T;cin >> T;while (T--){int u, v;cin >> u >> v;int x = find(u);int y = find(v);if (x != y){cout << -1 << endl;continue;}cout << lca(u, v) << endl;}
}

AcWing 506. 货车运输相关推荐

  1. 倍增LCA NOIP2013 货车运输

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

  2. poj1330|bzoj3732|noip2013 货车运输 kruskal+倍增lca

    学了一早上倍增,感觉lca还是tarjan好写. poj1330 1 #include <stdio.h> 2 #include <string.h> 3 #include & ...

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

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

  4. 【洛谷P1967】[NOIP2013]货车运输

    货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. 1 #include<iostr ...

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

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

  6. NOIP2013货车运输

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

  7. 货车运输题解 最大生成树+lca

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条 ...

  8. noip 2013 洛谷 P1967 货车运输

    题目:货车运输 大致题意: 给出一张无向带权图,对于m个询问(X,Y),要求找出X到Y的一条路径使得路径上的最小边权最大,并输出这个最小边权. 思路: 可以看出,X到Y的满足条件的路径一定在原图的最大 ...

  9. LUOGU 1967 货车运输 [noip 2013]

    * 1967 货车运输 * 题目描述 AA 国有 n n 座城市,编号从 1 1 到 nn ,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司 ...

最新文章

  1. 读书笔记2013第13本:《怎样解题》
  2. 30 多年的软件经验,总结出 10 个编写出更好代码的技巧
  3. java创建具体时间点_java单例饿汉模式对象创建时间点疑问
  4. Java的内存--存储
  5. 软件设计模式之适配器模式(JAVA)
  6. 线性代数学的中国根源
  7. POJ 2367 Genealogical tree【拓扑排序】
  8. 线路由器常见故障和排除方法
  9. 初识webservice 服务
  10. 服务器重装系统需要按什么,安装服务器系统前我们该做些什么
  11. IE10首个修复补丁出现 解决ASP.NET兼容性
  12. jenkins恢复删除的文件
  13. 谈canvas转图片的方法(base64编码)
  14. 使用windbg调试器定位程序的内存泄漏
  15. “博客之星”年度评选
  16. 画圆形头像的简单画法
  17. python基础语法25_Python基础语法习题参考(0-9关)
  18. imgui Study
  19. AIWIN 心电图智能诊断Baseline【线上0.719】
  20. 写给一个外汇女交易员的信(连载一)

热门文章

  1. Jsp学习笔记——第二天
  2. 【附源码】计算机毕业设计JAVA中国古诗词学习平台
  3. FastJson---高性能JSON开发包
  4. 动态生成google 身份验证码(口令)
  5. mysql 全外连接报错的原因
  6. win10安装mysql5.0_mysql系列 - 第0篇:win10安装mysql5.7.20解压版
  7. 混沌的市场里,怎么一眼识别出「好房子」
  8. uniapp微信小程序数据导出表格
  9. Windows程序设计——CreateFont详细解释
  10. stunnel4隧道工具