AcWing 506. 货车运输
题目描述:
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. 货车运输相关推荐
- 倍增LCA NOIP2013 货车运输
货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...
- poj1330|bzoj3732|noip2013 货车运输 kruskal+倍增lca
学了一早上倍增,感觉lca还是tarjan好写. poj1330 1 #include <stdio.h> 2 #include <string.h> 3 #include & ...
- 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
[洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...
- 【洛谷P1967】[NOIP2013]货车运输
货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. 1 #include<iostr ...
- 【题解】【洛谷 P1967】 货车运输
目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...
- NOIP2013货车运输
NOIP2013货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超 ...
- 货车运输题解 最大生成树+lca
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条 ...
- noip 2013 洛谷 P1967 货车运输
题目:货车运输 大致题意: 给出一张无向带权图,对于m个询问(X,Y),要求找出X到Y的一条路径使得路径上的最小边权最大,并输出这个最小边权. 思路: 可以看出,X到Y的满足条件的路径一定在原图的最大 ...
- LUOGU 1967 货车运输 [noip 2013]
* 1967 货车运输 * 题目描述 AA 国有 n n 座城市,编号从 1 1 到 nn ,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司 ...
最新文章
- 读书笔记2013第13本:《怎样解题》
- 30 多年的软件经验,总结出 10 个编写出更好代码的技巧
- java创建具体时间点_java单例饿汉模式对象创建时间点疑问
- Java的内存--存储
- 软件设计模式之适配器模式(JAVA)
- 线性代数学的中国根源
- POJ 2367 Genealogical tree【拓扑排序】
- 线路由器常见故障和排除方法
- 初识webservice 服务
- 服务器重装系统需要按什么,安装服务器系统前我们该做些什么
- IE10首个修复补丁出现 解决ASP.NET兼容性
- jenkins恢复删除的文件
- 谈canvas转图片的方法(base64编码)
- 使用windbg调试器定位程序的内存泄漏
- “博客之星”年度评选
- 画圆形头像的简单画法
- python基础语法25_Python基础语法习题参考(0-9关)
- imgui Study
- AIWIN 心电图智能诊断Baseline【线上0.719】
- 写给一个外汇女交易员的信(连载一)