codevs3287货车运输(最小生成树+LCA)
3287 货车运输
2013年NOIP全国联赛提高组
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。
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
3
-1
3
对于 30%的数据,0 < n < 1,000,0 < m < 10,000,0 < q < 1,000;
对于 60%的数据,0 < n < 1,000,0 < m < 50,000,0 < q < 1,000;
对于 100%的数据,0 < n < 10,000,0 < m < 50,000,0 < q < 30,000,0 ≤ z ≤ 100,000。
/*
先跑最小生成树找到那些尽量大的边,
然后LCA维护两点间最小载重就好了。
至于-1的情况嘛 如果建完图后不在图里的自然就到不了了
怎么算是不在图里呢 深度为0且不是树根(1)。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define maxn 1000000 using namespace std;
int n,m,q,x,y,num,cnt,a,b,c,k,tmp;
int deep[maxn],head[maxn],fa[maxn];
int f[][],dis[][];
struct node
{
int from;
int to;
int dis;
int next;
};
node e[maxn*],p[maxn*]; void add(int from,int to,int dis)
{
e[++num].from=from;
e[num].to=to;
e[num].dis=dis;
e[num].next=head[from];
head[from]=num;
} bool cmp(node x,node y)
{
return x.dis>y.dis;
} int find(int x)
{
if(x==fa[x])return x;
else return fa[x]=find(fa[x]);
} void Kruskal()
{
for(int i=;i<=n;i++)
fa[i]=i;
sort(p+,p+m+,cmp);
for(int i=;i<=m;i++)
{
int r1=find(p[i].from);
int r2=find(p[i].to);
if(r1!=r2)
{
fa[r2]=r1;
add(p[i].from,p[i].to,p[i].dis);
add(p[i].to,p[i].from,p[i].dis);
k++;
}
if(k==n-) break;
}
} void DFS(int now,int from,int c,int Dis)
{
f[now][]=from;deep[now]=c;
dis[now][]=Dis;
for(int i=head[now];i;i=e[i].next)
{
if(e[i].to!=from)
DFS(e[i].to,now,c+,e[i].dis);
}
} void get_fa()
{
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
{
f[i][j]=f[f[i][j-]][j-];
dis[i][j]=min(dis[i][j],dis[f[i][j-]][j-]);
dis[i][j]=min(dis[i][j],dis[i][j-]);
}
} int get_same(int a,int t)
{
for(int i=;i<;i++)
{
if(t&(<<i))
{
tmp=min(tmp,dis[a][i]);
a=f[a][i];
}
}
return a;
} int LCA_query(int a,int b)
{
if(a!=&&deep[a]==) return -;
if(b!=&&deep[b]==) return -;
tmp=0x3f3f3f3f;
if(deep[a]<deep[b]) swap(a,b);
a=get_same(a,deep[a]-deep[b]);
if(a==b) return tmp;
else
{
for(int i=;i>=;i--)
{
if(f[a][i]!=f[b][i])
{
tmp=min(tmp,dis[a][i]);
tmp=min(tmp,dis[b][i]);
a=f[a][i];
b=f[b][i];
}
}
tmp=min(tmp,dis[a][]);
tmp=min(tmp,dis[b][]);
}
return tmp;
} int main()
{
memset(dis,/,sizeof dis);
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
p[i].from=a;
p[i].to=b;
p[i].dis=c;
}
Kruskal();
DFS(,,,);dis[][]=0x3f3f3f3f;
get_fa();
scanf("%d",&q);
for(int i=;i<=q;i++)
{
scanf("%d%d",&x,&y);
printf("%d\n",LCA_query(x,y));
}
return ;
}
codevs3287货车运输(最小生成树+LCA)的更多相关文章
- C++之路进阶——codevs3287(货车运输)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n ...
- 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增
倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...
- 【NOIP2013/Codevs3287】货车运输-最小生成树(大)-树上倍增
https://www.luogu.org/problemnew/show/P1967 由题可知,我们走的路的边应尽可能大,所以通过kruscal建最大生成树的图,再树上倍增,注意可能有多棵树; #i ...
- P1967 货车运输[生成树+LCA]
题目描述 A国有n座城市,编号从 1到n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q* 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...
- 货车运输(LCA+最大生成树)
神奇传送门 恩,这是一道神奇的LCA+难度的题目. 题目是这样的: A 国有n座城市,编号从1到n,城市之间有 m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q辆货车在运输货物,司机们 ...
- P1967 货车运输【LCA】【生成树】
题目描述 A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重. 现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的 ...
- [NOIP2013/Codevs3287]货车运输-最小[大]生成树-树上倍增
Problem 树上倍增 题目大意 给出一个图,给出若干个点对u,v,求u,v的一条路径,该路径上最小的边权值最大. Solution 看到这个题第一反应是图论.. 然而,任意路径最小的边权值最大,如 ...
- 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)
洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...
- 洛谷P1967货车运输——倍增LCA
题目:https://www.luogu.org/problemnew/show/P1967 就是倍增LCA的裸题,注意一些细节即可. 代码如下: #include<iostream> # ...
随机推荐
- Gym - 101670A Amusement Anticipation(CTU Open Contest 2017 签到题)
题目&题意: 倒着找处于最后位置的等差数列的开头的位置. 例: 1 5 3 4 5 6 3 4 5 6是等差数列,它的开头的位置是3 PS: 读题真的很重要!!!!多组输入,上来就读错了!! ...
- vuex----------state的基础用法
先使用vue cli构建一个自己的vue项目 1.npm i -g vue-cli 2.vue init webpack sell (sell是你的项目名) 3.一路回车(在这个过程中会提示你是否安装 ...
- 实验1“C语言开发环境使用和数据类型、运算符、表达式”总结与体会
一.实验结论 1.判断奇偶 // 程序功能: // 要求用户从键盘输入一个整数,判断其是奇数还是偶数 #include <stdio.h> int main() { int x; prin ...
- JavaSE 学习笔记之包装类(十七)
基本数据类型对象包装类:是按照面向对象思想将基本数据类型封装成了对象. 好处: 1:可以通过对象中的属性和行为操作基本数据. 2:可以实现基本数据类型和字符串之间的转换. 关键字 对应的类名 by ...
- session 分布式处理-----https://segmentfault.com/a/1190000013447750?utm_source=tag-newest
第一种:粘性session 粘性Session是指将用户锁定到某一个服务器上,比如上面说的例子,用户第一次请求时,负载均衡器将用户的请求转发到了A服务器上,如果负载均衡器设置了粘性Session的话, ...
- java json数据转List对象的集合-----阿里巴巴插件---及原生json---JSON 与 对象 、集合 之间的转换 JSON字符串和java对象的互转【json-lib】
List<RunfastFullLess> list=(List<RunfastFullLess>)JSONArray.parseObject(activity.getFull ...
- HDU 4598 Difference
Difference Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ...
- 使用pymongo.find查询很慢的解决方式
1.前言: mongodb部署在阿里云服务器, mongodb中collection存储了百万条记录. 需求:优化查询指定时间段内的所有数据的查询时间,结果有百万级别. 最初:313587条记录耗时: ...
- Stealing Harry Potter's Precious BFS+DFS
Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...
- Oracle Multitenant Environment (一) About
About oracle mulittenant environment The multitenant architecture enables an Oracle database to func ...