NOIP2013D1T3货车运输
题目链接:http://www.luogu.org/problem/show?pid=1967
数据:http://www.cnblogs.com/wanglichao/p/5592058.html
题目描述
A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。
输入输出格式
输入格式:
输入文件名为 truck.in。
输入文件第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道
路。 接下来 m 行每行 3 个整数 x、 y、 z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z 的道路。意:x 不等于 y,两座城市之间可能有多条道路。
接下来一行有一个整数 q,表示有 q 辆货车需要运货。
接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市运输货物到 y 城市,注意:x 不等于 y。
输出格式:
输出文件名为 truck.out。
输出共有 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。
这题实在坑啊,一开始TLE+MLE+RE
后来发现自己空间算错,均摊一下发现其实空间是O(n)的(本来差点开了n2),解决了RE和MLE
然后改半天然后发觉自己没打路径压缩(woc,实在太久没打并查集了)
然后就A了233
题解:
第一步转化:
原图中的一部分边是可以删的,只要保留其中的最大生成树即可
写个并查集,用贪心,每次把权最大的边加入,合并两个集合,同时生成树
网上有个好方法(忘记是哪位大牛的了)对于每一条边,都新建一个点,作为“它连接的两个点的根节点”的根节点,因为是最大生成树,每次添加边时,两个点肯定不是同一棵树(同一个并查集)里的,所以这样保证可以生成一棵树(最开心的是这还是二叉树233)
还有一个隐藏小问题:你做出来的是个森林,不是一棵树,MDZZ怎么办?
我用的是相当低效的办法:在二叉树上加一大堆点(在原图里这些点都是权为0的边),显然不会影响结果,但现在想想不保留二叉树性质也无妨,而且只要加一个根节点就可以了……(主要是我是写了一半才发现这个问题——天然迟钝——二叉树都打完了,懒得改),这样一来边数应该就是n-1了(都连通了)。
既然是一棵树上了,那么就只要找出一条路径,做一遍LCA即可
1.Tarjan离线
据说可以Tarjan离线,但是我并不打算这么写,毕竟现在写在线的总是比离线的心里有底一点(离线几乎没写过,上次莫队的题目被我直接跳过了)
2.RMQ在线
我的方法:
再做一遍转化,根据dfs顺序把树摊开来:
比如样例中的数据
(懒得网上找了,自己画一个)

大图地址:http://www.cnblogs.com/wanglichao/gallery/image/170185.html
就是每次dfs找到一个点(包括回溯回来以后又一次经过)就记录一次(同时记录深度)
如果知道两个点在序列中的位置(第一次出现),就可以得到他们根节点的编号(即两点间深度最小的点)
于是就变成了神奇的区间最小值问题
先预处理做一遍dp,预处理出每一小块的最小值
使dp[i][j]为从i开始的2j个元素的最小值
很容易想到从j-1到j的转移方程(比一比就行了)
dp[i][j]=min(dp[i][j-1],dp[i+2j-1][j-1])
在每一次询问中只要找到小于等于区间大小的最大的2的幂,比一下两个dp就可以了
(连画图都懒得用)
dp[x][j]
----------------------------------
| | y是结尾
*******************************************这是要找最小值的数据
x是开头 | |
------------------------------
dp[y-2j+1][j]
min(dp[y-2j+1][j],dp[x][j])即为询问的答案
然后把路径上各个非叶子节点(也就是原图上的边)的最小值求一下
若为0则不连通,非0则输出
问题解决
上代码
#include <cstdio>
#include <algorithm>
using namespace std;
struct haha
{
int a,b,c;
} a[];
bool com(haha a,haha b)
{
return (a.c>b.c);
}
int d[],e[],po[],l[],r[],f[],gp[],dp[][],_dp[][],p[],q[];
int n,m,_n;
int read(){
int x=; char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<=''){ x=x*+ch-''; ch=getchar(); }
return x;
}
int dfs(int k,int p,int q)//把图按dfs顺序转成表
{
d[p]=q;
e[p]=k;
int ans=;
if(k<=n)
{
po[k]=p;
return ;
}
ans+=dfs(l[k],p+,q+);
ans++;
d[p+ans]=q;
e[p+ans]=k;
ans+=dfs(r[k],p+ans+,q+);
ans++;
d[p+ans]=q;
e[p+ans]=k;
return ++ans;
}
int fa(int p)//求并查集的祖先(其实是树的根节点)
{
if(f[gp[p]]==gp[p])
return gp[p];
else
{
gp[p]=fa(f[gp[p]]);
return gp[p];
}
}
void init()//处理输入的图,添加0边,生成一棵最大生成树(避免森林)
{
sort(a+,a+m+,com);
for(int i=;i<=n+m;i++)
{
f[i]=i;
gp[i]=i;
}
for(int i=;i<=m;i++)
if(fa(a[i].a)!=fa(a[i].b))
{
f[n+i]=n+i;
l[n+i]=fa(a[i].a);
r[n+i]=fa(a[i].b);
f[fa(a[i].a)]=n+i;
f[fa(a[i].b)]=n+i;
}
int _i=n+m;
for(int i=;i<n;i++)
if(fa(i)!=fa(i+))
{
_i++;
f[_i]=_i;
gp[_i]=_i;
l[_i]=fa(i);
r[_i]=fa(i+);
f[fa(i)]=_i;
f[fa(i+)]=_i;
}
}
void calc()//求区间最小值预处理
{
for(int i=;i<=_n;i++)
{
dp[i][]=d[i];
_dp[i][]=i;
}
int j=,k=;
while(k<=_n)
{
for(int i=;i<=_n-k+;i++)
if(dp[i][j-]<dp[i+k/][j-])
{
dp[i][j]=dp[i][j-];
_dp[i][j]=_dp[i][j-];
}
else
{
dp[i][j]=dp[i+k/][j-];
_dp[i][j]=_dp[i+k/][j-];
}
j++;
k*=;
}
k=;j=;
for(int i=;i<=_n;i++)
{
if(i>=*k)
{
k*=;
j++;
}
p[i]=j;
q[i]=k;
}
}
int lca(int x,int y)//求区间最小值
{
return (dp[x][p[y-x+]]>dp[y-q[y-x+]+][p[y-x+]])?_dp[y-q[y-x+]+][p[y-x+]]:_dp[x][p[y-x+]];
}
int main()
{
n=read();
m=read();
for(int i=;i<=m;i++)
{
a[i].a=read();
a[i].b=read();
a[i].c=read();
}
init();
_n=dfs(fa(),,);
calc();
m=read();
for(int i=;i<=m;i++)
{
int x,y;
x=read();
y=read();
x=po[x];y=po[y];
if(x>y)
swap(x,y);
int o=lca(x,y),sum=a[e[o]-n].c;
for(x=f[e[x]];x!=e[o];x=f[x])
sum=min(sum,a[x-n].c);
for(y=f[e[y]];y!=e[o];y=f[y])
sum=min(sum,a[y-n].c);
printf("%d\n",sum?sum:-);
}
return ;
}
NOIP2013D1T3货车运输的更多相关文章
- NOIP2013D1T3货车运输(最大生成树+倍增lca)
传送门 这道题,先用kruskal求一遍图中的最大生成树. 然后,倍增求lca,求lca的同时求出边权的最小值. #include <cstring> #include <cstdi ...
- NOIP2013D1T3货车运输 (生成树+树链剖分)
给出一个图,询问图上两点间路径上最小边权的最大值. 先跑一次最大生成树. 树剖维护路径最小边权. 树剖又双叒叕写挂了. #include<cstring> #include<cstd ...
- NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】
NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...
- NOIP2013 货车运输 (最大生成树+树上倍增LCA)
死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...
- C++之路进阶——codevs3287(货车运输)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n ...
- NOIP2013 货车运输
3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
- 【NOIP2013提高组】货车运输
货车运输 (truck.cpp/c/pas) [问题描述] A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆 ...
- Codevs3278[NOIP2013]货车运输
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 ...
随机推荐
- TCP/IP——基本知识
TCP / IP通常被认为是一个四层协议系统: 1) 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物 ...
- Sql Server 分区演练 【转】
Sql Server 分区演练 [转] 代码加注释,希望对初学者有用. USE [master]GOif exists (select * from sys.databases where name ...
- SQL Server 2012复制教程以及复制的几种模式
简介 SQL Server中的复制(Replication)是SQL Server高可用性的核心功能之一,在我看来,复制指的并不仅仅是一项技术,而是一些列技术的集合,包括从存储转发数据到同步数据到维护 ...
- windows 10卸载自带软件
http://jingyan.baidu.com/article/14bd256e4ad268bb6c26126d.html http://jingyan.baidu.com/album/ae97a6 ...
- MRDS学习四——自动型机器车
由自己的所在开始,探索自己周围的简单机器车,假设车子的行走路径如下: 我们要把L型路径写成一个Activity,然后由外部输入这个L的大小,最后这个Activity要能够在完成行走路径时吐出更大的L大 ...
- Pandas-多表操作
Pandas包对多个数据表(DataFrame)的常用整合功能. 目录 merge join concat append combin_first merge 合并 pandas.merge可根据一个 ...
- 【Bootstrap】Bootstrap-select多选下拉框实现
目录 前言 需要引用的它们 核心选项 核心方法 实例应用 回到顶部 前言 项目中要实现多选,就想到用插件,选择了bootstrap-select. 附上官网api链接,http://silviomor ...
- 【推荐】MySQL Cluster报错及解决方法(不断更新中)
排查问题技巧: MySQL Cluster 自带了一个错误代码的查看的小程序.通过这个小东西我们可以方便的定位问题的原因. 这个程序就是 perror 在MYSQL安装目录的bin下面. 如报错:ER ...
- 一条代码解决各种IE浏览器兼容性问题
在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 <!Doctype html> ...
- asp:DataGrid之添加asp:CheckBox做全选功能时涉及到绑值问题解决
最大的意图是为asp:CheckBox的value绑定上自己需要的value值,而不是默认的字符串"on" 参考了这篇文章带Value属性的扩展CheckBox控件,意义不大,换了 ...