3287 货车运输

2013年NOIP全国联赛提高组

时间限制: 1 s    空间限制: 128000 KB    题目等级 : 钻石 Diamond

题目描述 Description

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

输入描述 Input Description

第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路。
接下来 m 行每行 3 个整数 x、y、z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z 的道路。注意:x 不等于 y,两座城市之间可能有多条道路。
接下来一行有一个整数 q,表示有 q 辆货车需要运货。
接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市运输货物到 y 城市,注意:x 不等于 y。

输出描述 Output Description

输出共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货车不能到达目的地,输出-1。

样例输入 Sample Input

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

样例输出 Sample Output

3
-1
3

数据范围及提示 Data Size & Hint

对于 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。

 #include<bits/stdc++.h>
using namespace std;
#define maxn 10010
#define maxm 50010
struct Edge{
int from,to,value,next;
bool operator < (const Edge& a)const {
return value>a.value;}
}e[maxm],ee[maxm];
int n,m,fa[maxn],f[maxn][],deep[maxn],temp;
int head[maxn],tot,Q,num,dis[maxm][];
void Built_Map(){
for(int i=,x,y,w;i<=m;i++){
scanf("%d%d%d",&x,&y,&w);
e[i].from=x;e[i].to=y;e[i].value=w;
}
} int find(int x){
if(x==fa[x]) return x;
else return fa[x]=find(fa[x]);
}
void Add_Eedge(int u,int v,int w){
ee[++num].from=u;ee[num].value=w;ee[num].to=v;
ee[num].next=head[u];head[u]=num;
}
void Kursual(){
sort(e+,e+m+);int cur=;
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<=m;i++){
int u=e[i].from,v=e[i].to;
int rx=find(u),ry=find(v);
if(rx != ry){
cur++;fa[rx]=ry;
Add_Eedge(u,v,e[i].value);
Add_Eedge(v,u,e[i].value);
}
if(cur == n-)break;
}
}
void DFS(int now,int from,int deepth,int ktwo){
f[now][]=from;deep[now]=deepth;
dis[now][]=ktwo;
for(int i=head[now];i;i=ee[i].next)
if(ee[i].to!=from)
DFS(ee[i].to,now,deepth+,ee[i].value);
}
void Get_Fa(){
for(int i=;i<=;i++)
for(int j=;j<=n;j++){
f[j][i]=f[ f[j][i-] ][i-];
dis[j][i]=min(dis[j][i],dis[f[j][i-]][i-]);
dis[j][i]=min(dis[j][i],dis[j][i-]);
}
}
int get_same(int a,int t){
for(int i=;i<;i++)
if(t&(<<i)){
temp=min(temp,dis[a][i]);
a=f[a][i];
}
return a;
}
int LCA_Judge(int u,int v){
if(u!=&&deep[u]==) return -;
if(v!=&&deep[v]==) return -;
temp=0x3f3f3f3f;
if(deep[u]<deep[v]) swap(u,v);
u=get_same(u,deep[u]-deep[v]);
if(u==v) return temp;
for(int i=;i>=;i--){
if(f[u][i]!=f[v][i]){
temp=min(temp,dis[u][i]);
temp=min(temp,dis[v][i]);
u=f[u][i];v=f[v][i];
} }
temp=min(temp,dis[u][]);
temp=min(temp,dis[v][]);
return temp;
}
int main()
{
scanf("%d%d",&n,&m);
memset(dis,0x3f,sizeof dis);
Built_Map();
Kursual();// 生成一张最大生成树 保存在ee 边表中
DFS(,,,);dis[][]=0x3f3f3f3f;
Get_Fa();
scanf("%d",&Q);
for(int i=,x,y;i<=Q;i++){
scanf("%d%d",&x,&y);
printf("%d\n",LCA_Judge(x,y));
}
return ;
}

思路:先跑一遍最大生成树,再通过LCA查询判断。刚是我是想查询出最近公共祖先然后从图上跑一边,查询最小值,但又觉得不太好实现,看了几位大神的博客,巧妙的处理出了dis数组,就像f数组一样,可以通过倍增处理出来,优化了不少,估计考场上能想出是最大生成树+LCA的不少,相处dis数组的没几个。

其实跑最大生成树的那个边表没必要建双向边和head数组,刚开始我全给他建上了,导致我村最大生成树的边表的head数组用link数组代替的,问题就来了,link数组,在我的IDE上没问题没交上去就CE,唉!!!!!幸亏不是考试,要是CCF的老爷机也有这毛病我就杯具了。。。

还有这是个好题,值得好好看看,好久没有敲这么长的代码了,爽!!!!!

Codevs 3287 货车运输 == 洛谷P1967的更多相关文章

  1. Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...

  2. Codevs 3287 货车运输

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

  3. codevs 3287 货车运输 NOIP2013提高组

    题目链接:http://codevs.cn/problem/3287/ 题解: 和bzoj3732一毛一样,只不过是找最大生成树和最小值罢了,具体参见我的bzoj3732的博客 #include< ...

  4. 货车运输-洛谷-1967-LCA+最大生成树(kruskal(并查集))

    传送门 一道:LCA+最大生成树 个人认为把这两个的板子写好(并熟练掌握了之后)就没什么难的 (但我还是de了好久bug)qwq 最大生成树:其实就是最小生成树的变形 我用的是kruskal (个人觉 ...

  5. 洛谷 P1967 货车运输

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

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

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

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

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

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

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

  9. 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)

    洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...

随机推荐

  1. Python学习记录4(语句)

    赋值语句 序列解包 条件语句 语句块 布尔变量 条件执行和if语句 条件运算符 循环 while语句 for循环 迭代工具 跳出循环 break continue while truebreak语句 ...

  2. JWT的使用流程

    JWT的实现原理 一篇文章告诉你JWT的实现原理 发布于 3 个月前 作者 axetroy 3097 次浏览 来自 分享 在使用 JWT 的时候,有没有想过,为什么我们需要 JWT?以及它的工作原理是 ...

  3. 【前端_js】JavaScript知识点总结

    1.JavaScript的定义及特性 1.1.定义 javascript是运行在客户端的一种直译式脚本语言(程序在运行过程中逐行进行解释),它的解释器被称为JavaScript引擎,为浏览器的一部分. ...

  4. JAVA 修改环境变量不重启电脑生效方法

     1. 在安装JDK1.6(高版本)时(本机先安装jdk1.6再安装的jdk1.5),自动将java.exe.javaw.exe.javaws.exe三个可执行文件复制到了C:\Windows\Sys ...

  5. word域代码判断奇偶插入分页符

    阿拉伯数字页码判断奇偶插入分页符(PAGE表示当前页码,QUOTE 12表示插入分页符) {IF{=MOD({PAGE},2)} = 1 "{ QUOTE 12}" " ...

  6. Linux 用户管理(二)

    一.groupadd --create a new group 创建新用户 -g  --gid GID 二.groupdel --delete a group 三.passwd --update us ...

  7. Python基础——模块与包

    在Python中,可以用import导入需要的模块.包.库.文件等. 把工作路径导入系统路径 import os#os是工作台 import sys#sys是系统 sys.path.append(os ...

  8. Relu的缺点

    Relu不适合梯度过大的的输入 Relu是我们在训练网络时常用的激活函数之一(对我而言没有之一).然而最近发现Relu太脆弱了,经常由于输入的函数梯度过大导致网络参数更新后,神经元不再有激活功能.特别 ...

  9. 这一千个Python库,总有你想要的!

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  10. nrf52裸机学习——GPIO操作

    /** * @brief Function for writing a value to a GPIO pin. * * Note that the pin must be configured as ...