题目:https://www.luogu.org/problemnew/show/P1967

就是倍增LCA的裸题,注意一些细节即可。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const MAXN=,MAXM=,inf=1e9;
int n,m,q,dep[MAXN],pre[MAXN][],mn[MAXN][],ct1,ct=,head[MAXN];
int fa[MAXN],ans;
struct N{
int hd,to,next,w;
N(int h=,int t=,int n=,int w=):hd(h),to(t),next(n),w(w) {}
}edge[MAXM<<],ed[MAXM<<];
int find(int x)
{
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
void add(int x,int y,int z)
{
edge[++ct]=N(x,y,head[x],z);head[x]=ct;
edge[++ct]=N(y,x,head[y],z);head[y]=ct;
}
void add1(int x,int y,int z)
{
ed[++ct1]=N(x,y,,z);
}
bool cmp(N x,N y){return x.w>y.w;}
void kruskal()
{
sort(ed+,ed+ct1+,cmp);
for(int i=,u,v;i<=ct1;i++)
{
u=ed[i].to;
v=ed[i].hd;
int a=find(u);
int b=find(v);
if(a!=b)
{
add(u,v,ed[i].w);
fa[a]=b;
}
}
}
void dfs(int x,int f)
{
dep[x]=dep[f]+;
pre[x][]=f;
for(int i=head[x],u;i;i=edge[i].next)
{
u=edge[i].to;
if(u==f)continue;
mn[u][]=edge[i].w;
dfs(u,x);
}
}
void lca(int x,int y)
{
int ans=inf;
if(dep[x]>dep[y])swap(x,y);
int d=dep[y]-dep[x];
for(int i=;i<=;i++)
if((d>>i)&)ans=min(ans,mn[y][i]),y=pre[y][i];//不是i-1!
if(x==y)
{
printf("%d\n",ans);
return;
}
for(int i=;i>=;i--)//不是i>0
{
if(pre[x][i]!=pre[y][i])
{
ans=min(ans,min(mn[x][i],mn[y][i]));
x=pre[x][i];y=pre[y][i];
}
}
ans=min(ans,min(mn[x][],mn[y][]));
printf("%d\n",ans);
}
int main()
{
int x,y,z;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d%d",&x,&y,&z),add1(x,y,z);
for(int i=;i<=n;i++)fa[i]=i;
kruskal();
for(int i=;i<=n;i++)
if(!dep[i])dfs(i,);
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
{
pre[i][j]=pre[pre[i][j-]][j-];
mn[i][j]=min(mn[i][j-],mn[pre[i][j-]][j-]);
}
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&x,&y);
if(find(x)!=find(y))printf("-1\n");
else lca(x,y);
}
return ;
}

洛谷P1967货车运输——倍增LCA的更多相关文章

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

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

  2. 洛谷 P1967 货车运输

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

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

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

  4. [洛谷 P1967] 货车运输 (最大生成树 lca)

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

  5. 洛谷 P1967 货车运输 Label: 倍增LCA && 最小瓶颈路

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

  6. 洛谷 P1967 货车运输 LCA + 最小生成树

    两点之间边权最大值的最小值一定在图的最小生成树中取到. 求出最小生成树,进行倍增即可. Code: #include<cstdio> #include<algorithm> u ...

  7. 洛谷 P1967 货车运输(克鲁斯卡尔重构树)

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

  8. [NOIP2013] 提高组 洛谷P1967 货车运输

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

  9. 洛谷—— P1967 货车运输 || COGS——C 1439. [NOIP2013]货车运输

    https://www.luogu.org/problem/show?pid=1967#sub  ||  http://www.cogs.pro/cogs/problem/problem.php?pi ...

随机推荐

  1. 很多shell命令后面的单横杠和双横杠,原来这个意思

    原文: https://blog.csdn.net/deyili/article/details/5471023 ------------------------------------------- ...

  2. C/C++中怎样获取日期和时间

    C/C++中怎样获取日期和时间摘要: 本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时.时间的获取.时间的计算和显示格式等方面进行了阐述.本文还通过大量的实 ...

  3. 几种常用的listenner

    1.ServletContextListener:监控web容器的启动和关闭 2.HttpSessionListener:监控bs结构中b的session创建和session销毁 3.HttpSess ...

  4. sonar + ieda实现提交代码前代码校验

    代码风格不同一直是一件停头疼的事情,因为不同的工作经验,工作经历,每个人的代码风格不尽相同,造成一些代码在后期的维护当中难以维护, 查阅一些资料之后发现 idea + sonar 的方式比较适合我,实 ...

  5. MOS简单应用

    高端功率开关驱动的原理非常简单,和低端功率开关驱动相对应,就是负载一端和开关管相连,另外一端直接接地.正常情况下,没有控制信号的时候,开关管不导通,负载中没有电流流过,即负载处于断电状态:反之,如果控 ...

  6. 笔记04 WPF对象引用

    转自:http://www.fx114.net/qa-261-90254.aspx 我们应该都知道,XAML是一种声明式语言,XAML的标签声明的就是对象.一个XAML标签会对应着一个对象,这个对象一 ...

  7. Phalcon框架如何实现读写分离

    Phalcon框架如何实现读写分离 假设你已经在DI容器里注册了俩 db services,如下: <?php // 主库 $di->setShared('dbWrite', functi ...

  8. Linux高端内存

    Linux高端内存是针对物理内存来说的,虚拟内存没有高端这个概念.Linux系统将虚拟内存分为两个部分,即用户地 址空间和内核地址空间,对于32位系统来说,虚拟地址空间为4GB,其中用户空间范围为0- ...

  9. 官方Caffe-windows 配置与示例运行

    http://blog.csdn.net/guoyk1990/article/details/52909864 标签: caffewindows配置训练自己的数据 2016-10-24 13:34 1 ...

  10. 在Fedora 25中更换openjdk为oracle jdk

    本文修改自csdn: openjdk的好处是: 1.升级方便,fedora团队社区负责维护升级,安全稳定,质量有保证. 2.已经支持了很多应用:而且还越来越强大 3.支持eclipse开发. 实际上, ...