货车运输(codevs 3287)
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维护最小值
并查集忘记打return了,找了一晚上的错误
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#define M 50010
#define S 20
#define INF 0x3f3f3f3f
using namespace std;
int deep[M],father[M],fa[M][S+],dis[M][S+],n,m;
vector<int> grap[M];
vector<int> quan[M];
struct node
{
int l,r,v;
};node e[M*];
int cmp(const node&x,const node&y)
{
return x.v>y.v;
}
int find(int x)
{
if(father[x]==x)return x;
else return father[x]=find(father[x]);
}
void dfs(int now,int from,int c,int w)
{
fa[now][]=from;deep[now]=c;dis[now][]=w;
for(int i=;i<grap[now].size();i++)
{
int j=grap[now][i];
if(from!=j)
dfs(j,now,c+,quan[now][i]);
}
}
void get_fa()
{
for(int j=;j<=S;j++)
for(int i=;i<=n;i++)
{
fa[i][j]=fa[fa[i][j-]][j-];
dis[i][j]=min(dis[i][j-],dis[fa[i][j-]][j-]);
}
}
int LCA(int a,int b)
{
if(deep[a]<deep[b])swap(a,b);
int t=deep[a]-deep[b],ans=INF;
if(t)
{
for(int i=;i<=S;i++)
if(t&(<<i))
{
ans=min(ans,dis[a][i]);
a=fa[a][i];
}
}
if(a==b)return ans;
for(int i=S;i>=;i--)
if(fa[a][i]!=fa[b][i])
{
ans=min(ans,dis[a][i]);
ans=min(ans,dis[b][i]);
a=fa[a][i];
b=fa[b][i];
}
ans=min(ans,min(dis[a][],dis[b][]));
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d%d",&e[i].l,&e[i].r,&e[i].v);
sort(e+,e+m+,cmp);
for(int i=;i<=n;i++)father[i]=i;
for(int i=;i<=m;i++)
{
int a=find(e[i].l);
int b=find(e[i].r);
if(a!=b)
{
father[b]=a;
grap[e[i].l].push_back(e[i].r);
grap[e[i].r].push_back(e[i].l);
quan[e[i].l].push_back(e[i].v);
quan[e[i].r].push_back(e[i].v);
}
}
memset(dis,INF,sizeof(dis));
dfs(,,,);dis[][]=INF;get_fa();
int p;
scanf("%d",&p);
for(int i=;i<=p;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(find(x)!=find(y))printf("-1\n");
else printf("%d\n",LCA(x,y));
}
return ;
}
货车运输(codevs 3287)的更多相关文章
- AC日记——货车运输 codevs
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descri ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
- Codevs 3287 货车运输 == 洛谷P1967
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n 座城市,编 ...
- [NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
一开始觉得是网络流..仔细一看应该是最短路,再看数据范围..呵呵不会写...这道题是最大生成树+最近公共祖先.第一次写..表示各种乱.. 因为要求运输货物质量最大,所以路径一定是在最大生成树上的.然后 ...
- NOIP2013 货车运输 (最大生成树+树上倍增LCA)
死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...
- C++之路进阶——codevs3287(货车运输)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n ...
- Codevs3278[NOIP2013]货车运输
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 ...
- codevs3287货车运输(最小生成树+LCA)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 ...
- NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】
NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...
- NOIP2013 货车运输
3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...
随机推荐
- codevs 1131 统计单词数 2011年NOIP全国联赛普及组
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位 ...
- License开源许可协议
开源许可协议 License是软件的授权许可,表述了你获得代码后拥有的权利,可以对别人的作品进行何种操作,何种操作又是被禁止的. 开源许可证种类 Open Source Initiative http ...
- 手把手教你写 Vue UI 组件库
最近在研究 muse-ui 的实现,发现网上很少有关于 vue 插件具体实现的文章,官方的文档也只是一笔带过,对于新手来说并不算友好. 笔者结合官方文档,与自己的摸索总结,以最简单的 FlexBox ...
- chrom控制台常用方法
console.assert对输入的表达式进行断言,只有表达式为false时,才输出相应的信息到控制台 . console.count(这个方法非常实用哦)当你想统计代码被执行的次数 console. ...
- 前端css学习记录
参考资料:CSS权威指南(第三版)中文版 核心要点: HTML负责标记文档的结构(HyperText Markup Language),结构化语言. CSS 负责表现文档的样式(Cascading S ...
- atlas 日志分析脚本
#!/usr/bin/env python # encoding: utf-8 #@author: 东哥加油! #@file: log_analyze.py #@time: 2018/8/23 17: ...
- Mac OSX: 有线共享WiFi
首先连上有线 系统偏好设置->网络->点击左侧WiFi,再点击右下角[高级] 勾选[创建电脑对电脑网络],然后单击[好] 在顶部菜单栏击WiFi图标,如果WiFi未打开,则单击打开,如果已 ...
- perl的bareword
perl的bareword可能被认为:label . 句柄 .函数 . 普通字符串. 上下文不同,解释器有歧义. 最好用 use strict; use warning;
- Perl学习之四:语句
语句:if/unless while/foreach/do..while/for 1.表达式真价值总结任何表达式都有真假值:逻辑.字符串.列表.文件 2.if if(expression1){ sta ...
- 解决windows管理员已阻止你运行此应用问题
按WIN+R键,打开“运行”,然后输入“gpedit.msc",就是打开组策略,这个在控制面板中也可以打开. 在组策略里找到“计算机配置”-“Windows设置”-“安全设置”-“本地策略” ...