传送门

Luogu

解题思路

首先 \(\text{Kruskal}\) 一下,构造出一棵森林。

并查集还要用来判断连通性。

倍增 \(\text{LCA}\) 的时候顺便维护一下路径最小值即可。

细节注意事项

  • 代码稍微有点长,不要出小问题

参考代码

#include<cstdio>
#include<algorithm>
using std::sort;
const int MAXN=1e4+10;
const int MAXM=5*1e4+10;
inline int min(int a,int b){return a<b?a:b;}
inline void swap(int& a,int& b){int t=a;a=b;b=t;}
inline int read(){
int s=0;bool f=false;char c=getchar();
while(c<'0'||c>'9')f|=(c=='-'),c=getchar();
while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+(c^48),c=getchar();
return (f)?(-s):(s);
}
int n,m,q;
struct edge{int u,v,w;}g[MAXM];
inline bool cmp(edge a,edge b){return a.w>b.w;}
int tot,ver[MAXM<<1],dis[MAXM<<1],nxt[MAXM<<1],fir[MAXN];
inline void Add_edge(int u,int v,int w){
nxt[++tot]=fir[u],fir[u]=tot,ver[tot]=v,dis[tot]=w;
nxt[++tot]=fir[v],fir[v]=tot,ver[tot]=u,dis[tot]=w;
}
int dad[MAXN];
inline int findd(int k){
return dad[k]==k?k:dad[k]=findd(dad[k]);
}
inline bool is_unionn(int u,int v){
return findd(u)==findd(v);
}
inline void unionn(int u,int v){
int fu=findd(u),fv=findd(v);
if(fu!=fv)dad[fv]=fu;
}
inline void Kruskal(){
for(int i=1;i<=n;i++)
dad[i]=i;
sort(g+1,g+m+1,cmp);
for(int i=1;i<=m;i++)
if(!is_unionn(g[i].u,g[i].v))
unionn(g[i].u,g[i].v),Add_edge(g[i].u,g[i].v,g[i].w);
}
bool vis[MAXN];
int dep[MAXN],f[MAXN][22],w[MAXN][22];
inline void dfs(int u){
vis[u]=true;
for(int v,i=fir[u];i;i=nxt[i])
if(!vis[v=ver[i]])
dep[v]=dep[u]+1,f[v][0]=u,w[v][0]=dis[i],dfs(v);
}
inline int LCA(int x,int y){
if(!is_unionn(x,y)) return -1;
int ans=2147483647;
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;--i)
if(dep[f[x][i]]>=dep[y])
ans=min(ans,w[x][i]),x=f[x][i];
if(x==y) return ans;
for(int i=20;i>=0;--i)
if(f[x][i]!=f[y][i])
ans=min(ans,min(w[x][i],w[y][i])),x=f[x][i],y=f[y][i];
return min(ans,min(w[x][0],w[y][0]));
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++)
g[i].u=read(),g[i].v=read(),g[i].w=read();
Kruskal();
for(int i=1;i<=n;i++)
if(!vis[i]){
dep[i]=1;
dfs(i);
f[i][0]=i;
w[i][0]=2147483647;
}
for(int i=1;i<=20;i++)
for(int j=1;j<=n;j++)
f[j][i]=f[f[j][i-1]][i-1],w[j][i]=min(w[j][i-1],w[f[j][i-1]][i-1]);
q=read();
for(int x,y,i=1;i<=q;i++)
x=read(),y=read(),printf("%d\n",LCA(x,y));
return 0;
}

完结撒花 \(qwq\)

「NOIP2013」货车运输的更多相关文章

  1. 「NOIP2013」「LuoguP1967」货车运输(最大生成树 倍增 LCA

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

  2. 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp

    「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...

  3. xsy 2018 【NOIP2013】货车运输

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

  4. NOIP2013 D1T3 货车运输

    [NOIP2013T3]货车运输 背景 noip2013day1 描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重 量限制,简称限重.现在有 q 辆货 ...

  5. 「NOIP 2013」 货车运输

    题目链接 戳我 \(Solution\) 这一道题直接用\(kruskal\)重构树就好了,这里就不详细解释\(kruskal\)重构树了,如果不会直接去网上搜就好了.接下来讲讲详细过程. 首先构建\ ...

  6. 【NOIP2013】货车运输

    感觉这题挺水的……真的挺水的…… 原题: A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车 ...

  7. 【CJOJ1090】【洛谷1967】【NOIP2013】货车运输

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

  8. 【NOIP2013】货车运输 最大生成树+LCA

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

  9. $Noip2013/Luogu1967$ 货车运输 最大生成树+倍增$lca$

    $Luogu$ $Sol$ 首先当然是构建一棵最大生成树,然后对于一辆货车的起点和终点倍增跑$lca$更新答案就好.记得预处理倍增的时候不仅要处理走了$2^i$步后是那个点,还有这中间经过的路径权值的 ...

随机推荐

  1. leetcode 198 House Robber I

    function rob(nums) { if(!nums || nums.length === 0) { return 0; } else if(nums.length < 2){ retur ...

  2. Python MonkeyRunner 连接设备总是返回连接成功问题

    device = mr.waitForConnection(1,deviceName) 当使用waitForConnection时,不管设备是否连接,device总是返回一个对象,所以没有办法通过 i ...

  3. 配置数据库属性validationQuery

    配置数据库时,属性validationQuery默认值为“select 1”,对于oracle值应为“select 1 from dual” validationQuery属性:用来验证数据库连接的语 ...

  4. 整合SSM2

    SSM框架的搭建    注意:    1.SpringMVC和Spring        不需要什么特殊的配置就可以结合 2.MyBatis和Spring        1)需要引入额外的jar包:m ...

  5. 1.什么是springboot

    什么是spring? Spring是一个开源框架,2003 年兴起的一个轻量级的Java 开发框架,作者:Rod Johnson . Spring是为了解决企业级应用开发的复杂性而创建的,简化开发. ...

  6. [lua]紫猫lua教程-命令宝典-L1-01-08. math数学函数库

    L1[math]01. 取绝对值 L1[math]02. 三角函数 小知识:注意 lua下三角函数用的参数是弧度 而不是角度 弧度=角度*pi/180  -->弧度角度换算公式  lua的mat ...

  7. Wordpress里提示警告信息creating default object from empty value in *** 的解决方法

    PHP里提示 Creating default object from empty value 的问题,一般是由于PHP版升级的原因,PHP 5.4 以上的版本一般会报这个错误.PHP的解决方法:找到 ...

  8. HTML5学习(3)元素

    HTML5元素周期表 详情见:http://www.xuanfengge.com/funny/html5/element/

  9. Rabbitmq启动报错

    板卡掉电以后发现rabbitmq服务被停了,重启之: root@firefly:/var/lib/rabbitmq/mnesia# cd /usr/lib/rabbitmq/lib/rabbitmq_ ...

  10. vue 无法热替换/热更新

    参考了小伙伴的解决办法: 1.https://blog.csdn.net/win7583362/article/details/65443291 虽然我并不是用对方的方法解决的. 依然还是建议大家打开 ...