题目传送门

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

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

思路

这题思路想明白了就很简单,一句话题意:求树上两点间路线中边长最小的边权。

首先,为什么是树呢?限重肯定越大越好,因此我们可以跑出图的最大生成树(Kruskal)

之后,我们就可以对于每次询问来求出路径上的最小边权(最多能运的货物重量),这里可以用到树上倍增法(求LCA时一起求了,虽然LCA不会直接用到,但也是要一起求出来的)

至于两点间是否能互达,就可以用并查集维护一下就行了!

实现


提交记录过于真实,从0到10到65到70到95到AC Orz

可能是我常数写丑了,所以在洛谷更新评测姬前以及不开氧气优化都会T两个点??

code

 #include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#define maxm 50090
#define maxn 10090 using namespace std; int n,m,Q,tot,t;
int head[maxn],d[maxn],f[maxn][],fa[maxn],g[maxn][];
bool vis[maxn];
struct cellur{
int f,t,w;
}e[maxm];
struct node{
int to,next,val;
}edge[maxn<<]; bool cmp(cellur a,cellur b)
{
return a.w>b.w;
} void add(int x,int y,int z)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
edge[tot].val=z;
} int getf(int x)
{
if(fa[x]==x) return x;
else return fa[x]=getf(fa[x]);
} void Kruskal()
{
for(int i=;i<=n;i++) fa[i]=i;
sort(e+,e++m,cmp);
int cnt=;
for(int i=;i<=m;i++)
{
if(cnt==n-) break;
int pp=getf(e[i].f);
int qq=getf(e[i].t);
if(pp==qq) continue;
cnt++;
fa[qq]=pp;
add(e[i].f,e[i].t,e[i].w),add(e[i].t,e[i].f,e[i].w);
}
} void bfs(int s)
{
queue<int>q;
q.push(s);d[s]=;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(d[v]) continue;
d[v]=d[u]+;
f[v][]=u;g[v][]=edge[i].val;
for(int j=;j<=t;j++)
{
f[v][j]=f[f[v][j-]][j-];
g[v][j]=min(g[f[v][j-]][j-],g[v][j-]);
}
q.push(v);
}
}
} int lca(int x,int y)
{
int num=1e9;
if(d[x]<d[y]) swap(x,y);
for(int i=t;i>=;i--)
if(d[f[x][i]]>=d[y]) num=min(num,g[x][i]),x=f[x][i];
if(x==y) return num;
for(int i=t;i>=;i--)
if(f[x][i]!=f[y][i])
{
num=min(num,g[x][i]);
num=min(num,g[y][i]);
x=f[x][i],y=f[y][i];
}
return min(num,min(g[x][],g[y][]));
} int main()
{
freopen("truck.in","r",stdin);
freopen("truck.out","w",stdout);
scanf("%d%d",&n,&m);
t=log2(n)+;
for(int i=;i<=m;i++)
scanf("%d%d%d",&e[i].f,&e[i].t,&e[i].w);
Kruskal();
memset(g,,sizeof(g));
for(int i=;i<=n;i++) if(!d[i]) bfs(i);
// for(int i=1;i<=n;i++) printf("%d ",g[i][2]);
// return 0;
scanf("%d",&Q);
while(Q--)
{
int x=,y=;
scanf("%d%d",&x,&y);
int pp=getf(x);
int qq=getf(y);
if(pp!=qq) {printf("-1\n");continue;}
printf("%d\n",lca(x,y));
}
return ;
}

$bfs$也能解决不连通的问题:不bfs一次,而是让每个点都有深度。

11.6考试的时候边大小开小了&&LCA写错板子了hhh

NOIp2013 货车运输 By cellur925的更多相关文章

  1. [Luogu 1967] NOIP2013 货车运输

    [Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...

  2. NOIP2013 货车运输(最大生成树,倍增)

    NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...

  3. NOIP2013 货车运输 (最大生成树+树上倍增LCA)

    死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...

  4. NOIP2013 货车运输

    3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...

  5. Codevs3278[NOIP2013]货车运输

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

  6. 【洛谷P1967】[NOIP2013]货车运输

    货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. #include<iostrea ...

  7. noip2013货车运输

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

  8. NOIP2013货车运输[lca&&kruskal]

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

  9. [noip2013]货车运输(kruskal + 树上倍增)

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

随机推荐

  1. 洛谷—— P2812 校园网络

    P2812 校园网络 题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮 ...

  2. linux修改PS1,自定义命令提示符样式

    目录 参数说明 修改颜色 linux默认的命令提示符是这样的: 白色的,如果当前执行的命令很多的话,一整块屏幕上全是一堆输出信息,上一条命令在哪?我刚输入的命令在哪?找的头晕.有没有办法可以修改命令提 ...

  3. Go --- 设计模式(工厂模式)

    简易工厂主要是用来解决对象“创建”的问题.以下的例子取自<大话设计模式>中第一章,实现一个可扩展的“计算器”.当增加新的功能时,并不需改动原来已经实现的算法.由于是简易工厂,所以我们还是需 ...

  4. CentOS 5 全功能服务器搭建

    转自: http://www.php-oa.com/2007/12/27/centos-www.html 转:主要做为历史记录,以后用.另外很少见这么好的编译的文章,其实我不推荐用编译安装.但这个文章 ...

  5. 字符设备之poll机制

    poll机制作用:相当于一个定时器.时间到了还没有资源就唤醒进程. 主要用途就是:进程设置一段时间用来等待资源,假设时间到了资源还没有到来,进程就立马从睡眠状态唤醒不再等待.当然这仅仅是使用于这段时间 ...

  6. (void __user *)arg 中__user的作用

    __user宏简单告诉编译器(通过 noderef)不应该解除这个指针的引用(因为在当前地址空间中它是没有意义的). (void __user *)arg 指的是arg值是一个用户空间的地址,不能直接 ...

  7. 【转】TestNG执行顺序控制

    1.class执行顺序控制---testng.xml之preserve-order preserve-order:用来控制<test>里面所有<classes>的执行顺序.&l ...

  8. Atitit. 软件GUIbutton与仪表盘--webserver区--获取apache配置文件路径 linux and apache的启动、停止、重新启动

    Atitit.   软件GUIbutton与仪表盘--webserver区--获取apache配置文件路径 linux and apache的启动.停止.重新启动 能够通过"netstat  ...

  9. Tomcat和Jetty对WebSocket的支持

    公司项目须要,了解了下眼下几种支持WebSocket的框架.曾经用jWebSocket做过一些项目.相对来说.改jWebSocket的源代码略复杂,也不是一天两天能搞定的. 一调研才发现,如今非常多主 ...

  10. Random产生随机数问题

    昨天在开发时发现这个问题,在同一个for循环内,通过Random多次产生随机数得到的随机数竟是一样的!以前还真没发现这个问题. 以下是简化的代码,如果将random定义在for循环外面则不会有问题(猜 ...