题目:

A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路。每一条道路对车辆都有重量限制,简称限重。

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

对于每一组询问,相当于求点x到点y中所有路径中最小边权的最大值,这样就是货车的最大载重。

那么这显然可以用Kruskal重构树来解决,将重构树建成大根堆,就可以求最大边权的最小值;同理,小根堆就是最小边权的最大值。

那么做这道题就是重构树的模板题了。复杂度O(q logn)。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=2e5+10;
4 struct edge{
5 int u,v,w;
6 bool operator < (const edge &x){
7 return w>x.w; //小根堆
8 }
9 }e[N];
10 vector<int> g[N];
11 int n,m,q,cnt,fa[N],vis[N],val[N],d[N],f[N][30];
12 int find(int x){
13 return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
14 }
15
16 void kruskal(){
17 sort(e+1,e+m+1);
18 for(int i=1;i<=n;i++) fa[i]=i;
19 for(int i=1;i<=m;i++){
20 int fu=find(e[i].u),fv=find(e[i].v);
21 if(fu!=fv){
22 val[++cnt]=e[i].w;
23 fa[cnt]=fa[fu]=fa[fv]=cnt;
24 g[cnt].push_back(fu);
25 g[cnt].push_back(fv);
26 g[fu].push_back(cnt);
27 g[fv].push_back(cnt);
28 }
29 }
30 }
31
32 void dfs(int u,int fa){
33 d[u]=d[fa]+1,f[u][0]=fa,vis[u]=1;
34 for(int i=1;(1<<i)<=d[u];i++)
35 f[u][i]=f[f[u][i-1]][i-1];
36 for(int i=0;i<g[u].size();i++){
37 int v=g[u][i];
38 if(v!=fa) dfs(v,u);
39 }
40 }
41
42 int lca(int x,int y){
43 if(d[x]<d[y]) swap(x,y);
44 for(int i=25;i>=0;i--)
45 if(d[f[x][i]]>=d[y]) x=f[x][i];
46 if(x==y) return x;
47 for(int i=25;i>=0;i--)
48 if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
49 return f[x][0];
50 }
51
52 int main(){
53 scanf("%d%d",&n,&m);
54 cnt=n;
55 for(int i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
56 kruskal();
57 for(int i=1;i<=cnt;i++){//注意图可能是个森林,不要漏掉
58 if(!vis[i]){
59 int f=find(i);
60 dfs(f,0);
61 }
62 }
63 scanf("%d",&q);
64 while(q--){
65 int u,v;
66 scanf("%d%d",&u,&v);
67 if(find(u)!=find(v)) cout<<-1<<endl;
68 else cout<<val[lca(u,v)]<<endl;
69 }
70 return 0;
71 }

NOIP 2013 提高组 洛谷P1967 货车运输 (Kruskal重构树)的更多相关文章

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

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

  2. Luogu P1967 货车运输(Kruskal重构树)

    P1967 货车运输 题面 题目描述 \(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \ ...

  3. 洛谷 P1967 货车运输

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

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

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

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

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

  6. [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)

    洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...

  7. 洛谷 P1967 货车运输(克鲁斯卡尔重构树)

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

  8. 洛谷 P1967 货车运输 Label: 倍增LCA && 最小瓶颈路

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

  9. 洛谷P1967 货车运输

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

随机推荐

  1. BACnet MS/TP转MQTT网关金鸽BL103

    BACnet MS/TP转MQTT网关金鸽BL103BL103是一款BACnet路由器,实现 BACnet MS/TP 总线和以太网 BACnetIP 之间通信路由功能,同时也是一款Modbus RT ...

  2. Luogu1993 小K的农场 (差分约束)

    \(if \ a - b <= c, AddEdge(b, a, c)\) Be careful, MLE is not good. #include <cstdio> #inclu ...

  3. 除了Synchronized关键字还有什么可以保证线程安全?

    除了Synchronized关键字还有什么可以保证线程安全?     日常使用Java开发时,多线程开发,一般就用Synchronized保证线程安全,防止并发出现的错误和异常,那么 除了Synchr ...

  4. 用HTTP服务的方式集成learned cardinality estimate方法进 Postgresql

    代码地址:postgresql-13.1-ml: Integration of CardEst Methods into PostgreSQL by HTTP Server (github.com) ...

  5. IP 地址分类和子网掩码

    IP 地址分类 IP 地址是由 4 组 8 位二进制表示的,格式为:xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.十进制表示的格式为:xxxx.xxxx.xxxx.xxxx, ...

  6. dentry的引用计数不对导致的crash

    [17528853.189372] python invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=-998[17528853.189 ...

  7. ARC120F Wine Thief (组合数学)

    题面 有一个长为 N N N 的序列,相邻的两个数中只能选一个,总共选 k k k 个数,一种方案的价值为选的 k k k 个数的和,问所有合法方案的价值总和,答案对 998244353 取模. 1 ...

  8. 弹簧高跷题解---双向DP---DD(XYX)​​​​​​​的博客

    三 . 弹簧高跷 时间限制: 1 Sec  内存限制: 128 MB 题目描述.输入.输出          ----------- 方法 这道题用DP是可以解决的.因为每一次跳跃都与前一次跳跃有关, ...

  9. Linus命令

    参考: https://blog.csdn.net/weixin_44191814/article/details/120091363 vim编辑器 ## Vim基本模式 [对文件进行操作]vim 文 ...

  10. NetCore性能优化

    NetCore性能优化2.非跟踪查询在只读方案中使用结果时,非跟踪查询十分有用,可以更快速地执行.增加AsNoTracking()表示非跟踪,如:var users = context.User.As ...