【NOIP2013/Codevs3287】货车运输-最小生成树(大)-树上倍增
https://www.luogu.org/problemnew/show/P1967
由题可知,我们走的路的边应尽可能大,所以通过$kruscal$建最大生成树的图,再树上倍增,注意可能有多棵树;
#include <bits/stdc++.h>
#define read read()
#define up(i,l,r) for(register int i = (l);i <= (r);i++)
#define down(i,l,r) for(register int i = (l);i >= (r);i--)
#define traversal_vedge(i) for(register int i = head[u]; i ;i = e[i].nxt)
#define ll long long
using namespace std;
int read
{
int x = , f = ; char ch = getchar();
while(ch < || ch > ) {if(ch == '-')f = -; ch = getchar();}
while(ch >= && ch <=) {x = * x + ch - ;ch = getchar();}
return x * f;
}
const int N = 1e4+,M = 5e5+,inf = 0x3f3f3f3f;
int n,m,q,f[N];
struct kedge{
int u,v,limit;
bool operator < (const kedge &x) const{
return limit > x.limit;
}
}ke[M<<]; struct edge{
int v,limit,nxt;
}e[M<<];int tot,head[N]; void build_tree(int u,int v,int w) {e[++tot] = (edge){v,w,head[u]}; head[u] = tot;} //-----------------------------------------------------------------
int find(int i) {if(f[i] == i) return i;f[i] = find(f[i]);return f[i]; }
void kruscal(){
sort(ke+,ke+m+);
up(i,,n) f[i] = i;
int cnt = ;
up(i,,m)
{
if(cnt == n-) break;
if(find(ke[i].u) != find(ke[i].v))
{
f[f[ke[i].u]] = f[ke[i].v];
cnt++;
build_tree(ke[i].u,ke[i].v,ke[i].limit);
build_tree(ke[i].v,ke[i].u,ke[i].limit);//debug ke[i].u -> ke[i].v;
}
else continue;
}
}
//----------------------------------------------------------------------- int fa[N][],mine[N][],dep[N],vis[N];//debug 15 ->14 void dfs(int u,int f,int w){
vis[u] = ;
dep[u] = dep[f] + ;
fa[u][] = f;
mine[u][] = w;
for(int i = ; (<<i) <= dep[u]; i++)
{
fa[u][i] = fa[fa[u][i-]][i-];
mine[u][i] = min(mine[u][i-],mine[fa[u][i-]][i-]);
}
traversal_vedge(i)
{
int v = e[i].v;
if(v == f) continue;
dfs(v,u,e[i].limit);
}
} /*int LCA(int x,int y){
if(dep[x] < dep[y]) swap(x,y);
down(i,14,0)
{
if(dep[fa[x][i]] >= dep[y])
x = fa[x][i];
}
if(x == y) return x;
down(i,14,0)
{
if(fa[x][i] != fa[y][i])
{
x = fa[x][i];
y = fa[y][i];
}
}
return fa[x][0];
}*/
//----------------------------------------------------------------- int query(int x,int y)
{
int ans = inf;
if(dep[x] < dep[y]) swap(x,y);
down(i,,)
{
if(dep[fa[x][i]] >= dep[y])
{
ans = min(ans,mine[x][i]);
x = fa[x][i];
}
}
if(x == y) return ans;
down(i,,)
{
if(fa[x][i] != fa[y][i])
{
ans = min(ans,min(mine[x][i],mine[y][i]));
x = fa[x][i];
y = fa[y][i];
}
}
ans = min(ans,min(mine[x][],mine[y][]));
return ans;
} /*int query(int x,int lca){
//if(x == lca) return 0x3f3f3f3f;
int i = 0;
while(dep[fa[x][i]] > dep[lca] ) i++;
return mine[x][i];
}*/ void work(){
kruscal();
memset(mine,0x3f,sizeof(mine));
//debug 未考虑多棵树
up(i,,n)
{
if(!vis[i])
dfs(i,,inf);
}
q = read;
while(q--)
{
int x = read, y = read;
if(find(x) != find(y))
{
printf("-1\n");
continue;
}
//int lca = LCA(x,y);
//ans = min(query(x,lca),query(y,lca));
printf("%d\n",query(x,y));
}
} void readdata()
{
n = read; m = read;
up(i,,m)
{
ke[i].u = read; ke[i].v = read; ke[i].limit = read;
}
} int main()
{
freopen("input21.txt","r",stdin);
//freopen("output21.out","w",stdout);
readdata();
work();
return ;
}
最开始的写法之所以是错误的,是因为会多求一段,而我们只需要求到LCA就行;
【NOIP2013/Codevs3287】货车运输-最小生成树(大)-树上倍增的更多相关文章
- [NOIP2013/Codevs3287]货车运输-最小[大]生成树-树上倍增
Problem 树上倍增 题目大意 给出一个图,给出若干个点对u,v,求u,v的一条路径,该路径上最小的边权值最大. Solution 看到这个题第一反应是图论.. 然而,任意路径最小的边权值最大,如 ...
- xsy 2018 【NOIP2013】货车运输
[NOIP2013]货车运输 Description A 国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆车在不超 ...
- 「NOIP2013」「LuoguP1967」货车运输(最大生成树 倍增 LCA
题目描述 AA国有nn座城市,编号从 11到nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最 ...
- codevs3287货车运输(最小生成树+LCA)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 ...
- Luogu1967 NOIP2013 货车运输 最大生成树、倍增
传送门 题意:给出一个$N$个节点.$M$条边的图,$Q$次询问,每一次询问两个点之间的所有可行路径中经过的边的边权的最小值中的最大值.$N \leq 10000 , M \leq 50000 , Q ...
- $Noip2013/Luogu1967$ 货车运输 最大生成树+倍增$lca$
$Luogu$ $Sol$ 首先当然是构建一棵最大生成树,然后对于一辆货车的起点和终点倍增跑$lca$更新答案就好.记得预处理倍增的时候不仅要处理走了$2^i$步后是那个点,还有这中间经过的路径权值的 ...
- C++之路进阶——codevs3287(货车运输)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n ...
- NOIP2013 D1T3 货车运输 zz耻辱记
目录 先来证明下lemma: 图上2点间最小边权最大的路径一定在MST上 感性理解下: 每次kruskal algo都连接最大的不成环边 此时有2个未联通的联通块被连起来. 那么考虑u, v两点的联通 ...
- NOIP2013 D1T3 货车运输
[NOIP2013T3]货车运输 背景 noip2013day1 描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重 量限制,简称限重.现在有 q 辆货 ...
随机推荐
- python:推导式套路
推导式套路 列表推导式为例的推导式详细格式,同样适用于其他推导式 variable = [out_exp_res for out_exp in input_list if out_exp == 2] ...
- docker 在window10下的安装
在win10下安装docker 打开下载页面 https://store.docker.com/editions/community/docker-ce-desktop-windows 打开控制面板 ...
- Spring线程池的5个要素
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-// ...
- PyQt5 入门
换了VSCODE开发,感觉比sublime好点,可能是由于第三版老弹框烦人吧.VSCODE看着也挺好看的. 学习 PyQt5 中文教程 0. 安装完之后错误 pip 安装了 pyqt5 from Py ...
- spring boot 错误处理之深度历险
今天终于把 boot 的异常处理完全研究透了: boot提供了很多错误的处理工作.默认情况下,我们会看到一个whiteLabel(白标)的页面. 这个可能不是我们所需.因此我们需要定制.我于是做了个深 ...
- Creating adaptive web recommendation system based on user behavior(设计基于用户行为数据的适应性网络推荐系统)
文章介绍了一个基于用户行为数据的推荐系统的实现步骤和方法.系统的核心是专家系统,它会根据一定的策略计算所有物品的相关度,并且将相关度最高的物品序列推送给用户.计算相关度的策略分为两部分,第一部分是针对 ...
- 微信小程序 用户登录 服务器端(TP5.1)实现
先来看官方提供的流程图: 客户端: 小程序客户端通过 wx.login() 获取登录code , 然后将code当做参数传递到服务器. getToken(){ var that = this; wx. ...
- python_06 函数、全局变量与局部变量、函数递归
函数 1.函数的定义: def 函数名(参数): #解释函数的功能 代码块 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行 ...
- 如何将R中的data frame对象的数据导入到DB
在使用ARIMA模型来预测我们的销量的时候,如果保存预测版本进DB,以供后续分析呢 1. 在定义变量阶段我们定义了dfResult <- data.frame() 这是一个data f ...
- cdnbest获取,删除,增加,修改域名列表,高级设置api示例
<?php $uid = 28; $vhost = 'asdfw'; $token = getToken($uid, $vhost); print_r($token); //获取token fu ...