vijos1843(货车运输)

Vijos 评测服务源代码 Vijos 在线评测系统 VTS.EXE 的源代码, Visual Basic .NET 2005 编写的,版本比较老 立即下载

每个货车可以运输的最大货物量就是起点到终点的某一条路径上的最小权值,为了使运输量最大,那就是选一条路使得这条路上的最小权值边最大。

于是想到最大生成树,然后就是树上查询两点之间路径上的最小值,熟练剖分可以解。

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define Del(a,b) memset(a,b,sizeof(a))
const int N = 10005;
int dep[N],siz[N],fa[N],id[N],son[N],val[N],top[N];
int num;
vector<int> v[N];
struct Edge{
    int from;
    int to;
    int w;
    bool operator < (const Edge& T) const{
        return w>T.w;
    }
}ed[50000+50];
struct tree
{
    int x,y,val;
    void read(int a,int b,int c){
        x = a; y = b; val = c;
    }
};
tree e[N];
void dfs1(int u, int f, int d) {
    dep[u] = d;
    siz[u] = 1;
    son[u] = 0;
    fa[u] = f;
    for (int i = 0; i < v[u].size(); i++) {
        int ff = v[u][i];
        if (ff == f) continue;
        dfs1(ff, u, d + 1);
        siz[u] += siz[ff];
        if (siz[son[u]] < siz[ff])
            son[u] = ff;
    }
}
void dfs2(int u, int tp) {
    top[u] = tp;
    id[u] = ++num;
    if (son[u]) dfs2(son[u], tp);
    for (int i = 0; i < v[u].size(); i++) {
        int ff = v[u][i];
        if (ff == fa[u] || ff == son[u]) continue;
        dfs2(ff, ff);
    }
}
#define lson(x) ((x<<1))
#define rson(x) ((x<<1)+1)
struct Tree
{
    int l,r,val;
};
Tree tree[4*N];
void pushup(int x) {
    tree[x].val = min(tree[lson(x)].val, tree[rson(x)].val);
}
void build(int l,int r,int v)
{
    tree[v].l=l;
    tree[v].r=r;
    if(l==r)
    {
        tree[v].val = val[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(l,mid,v*2);
    build(mid+1,r,v*2+1);
    pushup(v);
}
int query(int x,int l, int r)
{
    if (tree[x].l >= l && tree[x].r <= r) {
        return tree[x].val;
    }
    int mid = (tree[x].l + tree[x].r) / 2;
    int ans = 0x3f3f3f3f;
    if (l <= mid) ans = min(ans, query(lson(x),l,r));
    if (r > mid) ans = min(ans, query(rson(x),l,r));
    return ans;
}
int Yougth(int u, int v) {
    int tp1 = top[u], tp2 = top[v];
    int ans = 0x3f3f3f3f;
    while (tp1 != tp2) {
        if (dep[tp1] < dep[tp2]) {
            swap(tp1, tp2);
            swap(u, v);
        }
        ans = min(query(1,id[tp1], id[u]), ans);
        u = fa[tp1];
        tp1 = top[u];
    }
    if (u == v) return ans;
    if (dep[u] > dep[v]) swap(u, v);
    ans = min(query(1,id[son[u]], id[v]), ans);
    return ans;
}
int par[10000+10];
int find(int u)
{
    if(u==par[u]) return u;
    return par[u] = find(par[u]);
}
int main()
{
    int n,m;
    memset(val,0x3f3f3f3f,sizeof(val));
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
        scanf("%d%d%d",&ed[i].from,&ed[i].to,&ed[i].w);
    sort(ed,ed+m);
    for(int i=1;i<=n;i++) par[i] = i; int cn = 1;
    for(int i=0;i<m;i++)
    {
        int fx = find(ed[i].from);
        int fy = find(ed[i].to);
        if(fx!=fy){
            par[fx] = fy;
            e[cn].read(ed[i].from,ed[i].to,ed[i].w);
            v[e[cn].x].push_back(e[cn].y);
            v[e[cn].y].push_back(e[cn].x);
            cn++;
        }
    }
    num = 0;
    dfs1(1,0,1);
    dfs2(1,1);
    for (int i = 1; i < cn; i++) {
        if (dep[e[i].x] < dep[e[i].y]) swap(e[i].x, e[i].y);
        val[id[e[i].x]] = e[i].val;
    }
    build(1,num,1);
    int q,a,b; scanf("%d",&q);
    while(q--)
    {
        scanf("%d%d",&a,&b);
        int fa = find(a);
        int fb = find(b);
        if(fa==fb) printf("%d\n",Yougth(a,b));
        else printf("-1\n");
    }
    return 0;
}


Vijos的本地版题库(高校信息学测评系统) 立即下载

相关推荐

雪莉果的Axure原型工厂vol.006 中继器应用(二)——多选穿梭框

如果你用axure有一段时间了,那么你很快就能琢磨出一个大体设计流程,比如加一个中间过度的元件,来储存需要穿梭的内容;但是如果你再想一想,就会发现,这样做,似乎只能解决单选,那么多选需要怎么操作呢? 这时候,中继器就会告诉你,我还能做的更多。

weixin_43829792的博客 977

【vijos】在vijos的自己的域中创建题目

创建属于自己的域 填入对应信息即可。 创建题目 点击题库 往下拉,点击创建题目 进入题目之后,点击设置 接下来就是重点,配置数据点:(如果想直接用,后面有捷径。) 写一个正确答案的代码: 例如: #include<iostream> using namespace std; int main() { int a, b; cin >> a >> b; cout << a + b << endl; return 0; } 生

Tanzq的博客 1319

山东大学机器学习(实验一内容)——线性回归

1. 描述 第一个练习将为你提供线性回归练习。这些练习已经用Matlab进行了广泛的测试,但它们也应该在Octave中工作,它被称为“免费版的Matlab”。如果你使用的是Octave,那就是 一定要安装Image包(可在Windows中作为选项使用)安装程序,可从Octave-Forge获得Linux。 2.线性回归 回想一下,线性回归模型是 hθ(x)=θTx=∑j=0nθjxj h_{\th...

HachiLin的博客 4108

Vijos OJ搭建

教程 Vijos\text{Vijos}Vijos 开源 OJ\text{OJ}OJ 搭建教程 安装 环境: ubuntu\text{ubuntu}ubuntu 16.0.416.0.416.0.4 MongoDB\text{Mongo} \text{DB}MongoDB安装 Rabbitmq\text{Rabbitmq}Rabbitmq 安装 Node JS\text{Node}\...

lucius-liu.cn 3070

告别CMake依赖!在Visual Studio 2022中直接配置VTK 9.4开发环境(附完整项目示例)

本文详细介绍了如何在Visual Studio 2022中直接配置VTK 9.4开发环境,无需依赖CMake。通过图文教程和完整项目示例,帮助C++开发者快速集成VTK库,简化开发流程,提升工作效率。特别适合科学可视化任务的开发者。

weixin_26804345的博客 415

关于WPF PasswordBox 增加提示文案,请输入密码,亲测最快方案,改最少的代码!!!

关于WPF PasswordBox 增加提示文案,请输入密码,亲测最快方案,不需要像其他方案改任何PasswordBox的样式,直接加个texbox控件显示隐藏即可1.xaml,注意关键代码,样式之类可以不管 2.xaml.cs

鸣的博客 1543

Vijos数据结构基础C++实验整理(十一)——二叉搜索树

实验内容: 创建带索引的二叉搜索树类。存储结构使用链表,提供操作:插入、删除、按名次删除、查找、按名次查找、升序输出所有元素 输入第一行一个数字m (m<=1000000),表示有m个操作。 接下来m行,每一行有两个数字a,b: • 当输入的第一个数字 a 为 0 时,输入的第二个数字 b 表示向搜索树中插入 b • 当输入的第一个数字 a 为 1 时,输入的第二个数字 b 表示向搜索树中查找 b • 当输入的第一个数字 a 为 2 时,输入的第二个数字 b 表示向搜索树中删除 b • 当输入的第一个

SunnySantino的博客 1617

别让你的URDF模型在Gazebo里‘躺平’:手把手教你配置libgazebo_ros_diff_drive插件让两轮小车动起来

本文详细解析了如何在Gazebo中配置libgazebo_ros_diff_drive插件,使两轮小车模型实现动态仿真。从URDF模型到传动装置,再到差速驱动插件的精细调参,手把手教你解决机器人‘躺平’问题,提升ROS1与Gazebo仿真的实战能力。

weixin_42552716的博客 334

vijos循环(高精度)

乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。 众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象。 这时乐乐的问题就出来了:是不是只有最后一位才

zjy2015302395的博客 641

【HDR】曝光融合(Exposure Fusion)

在曝光融合(Exposure Fusion)算法问世之前,多曝光序列合成用于显示的HDR需要两个步骤,第一步是将多张不同曝光的低动态范围图像合成为HDR(例如Debevec提出的加权融合方法),通常HDR为12bit或者16bit;第二步是通过tonemapping对高动态范围HDR进行压缩以支持低动态范围显示设备(例如Durand提出的基于双边滤波的tonemapping算法),一般会压缩至8bit。

专注人工智能,主攻CV 1万+

两级运算放大器设计与仿真

运算放大器(简称运放)是许多模拟系统和混合信号系统中的一个完整部分。各种不同复杂程度的运放被用来实现各种功能:从直流偏置的产生到高速放大或滤波。伴随者每一代 CMOS 工艺,由于电源电压和晶体管沟道长度的减小,为运放的设计不断提出复杂的课题。 运算放大器的设计可以分为两个较为独立的步骤,第一步是选择或搭建运放的基本结构,绘出电路结构草图,第二步就要选择直流电流,手工设计管子尺寸,以及设计补偿电路等等,然后在手工计算的基础上,运用模拟电路仿真软件对设计的两级运放进行仿真,并对电路进行后续的调试和修改。....

qq_50968231的博客 11万+

国内外OJ简介

主流的几个像POJ、ZOJ、HDUOJ、HOJ(哈工大)、HUST(华中科大)的几个就不介绍了!下面介绍几个很不错但是很少人知道的OJ!希望对读者有些许帮助!以下的介绍顺序不是按任何顺序排列的,为看到想到才写的!若有不妥之处,请读者见谅!!   Vijos(Velocious Informatics Judge Online System) 地址: http://www.vijos.cn/

Bright 8967

C语言关键字static的绝妙用途

为什么要说static妙,它确实是妙,在软件开发或者单片机开发过程中,大家总以为static就是一个静态变量,在变量类型的前面加上就自动清0了,还有就是加上static关键字的,不管是变量还是关键字,在局部变量中,变量仅限于局部可见,在全局区中,static变量或函数仅限于本文件可见,当然还有一个重要的特性被忽略了。。。。       就是static修饰的局部变量 它的数值 是上一次函数调用结

Bruce.yang的嵌入式之旅 5378

vijos P1843货车运输

描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。 格式 输入格式 第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路。 接下来 m 行每行 3 个整数 x、y、z,每两

jjs98 1319

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Vijos P1843(货车运输-最大生成树&树上倍增)

P1843货车运输 Accepted 标签:NOIP提高组2013 描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。 格式 输入格式 第

nike0good |Oier&ACMer | 熟能生巧 3751

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Vijos 1843 货车运输(最大生成树 + 树上倍增模板)

解法:首先想到肯定是尽量用边权大的边,所以直接用最大生成树建图即可。建完图之后,由于询问数很大,所以要想一个高效的求两点之间边权最小的边的办法。一开始想到树链剖分,感觉很麻烦,代码量巨大。想用LCA的ST表来维护,但是发现维护困难,因为是边而不是点。最后才知道要用树上倍增做。预处理出深度小的点到深度大的i点最小的边权是多少。先求出x和y的lca,然后直接求出x到lca, y到lca的最小边权。取最

llzhh的博客 323

洛谷 P1967 Vijos P1843 CODE[VS] P3287 [NOIP2013 D1T3] 货车运输

最大生成树,lca

依然一笑作春温。 1598

货车运输 vijos 1843 NOIP2013 D1T3 最大生成树,并查集,(伪·LCA)

(本人比较笨,没写LCA,在树上暴力跑过了此题。) 可以证明答案一定在最大生成树上,因为如果答案比最大生成树上的路径更优,那么最大生成树一定不是正确的。反证之。 同时注意到最大生成树过程中是使用了并查集的,所以不会出现某些点“被丢下”的情况,希望读者不必在此纠结。 我们跑完最大生成树之后,已经有了一个并查集,我们用并查集来判断两个点是否联通,若两个点不在一个并查集中,那么他们也一定在原图中不...

weixin_34144450的博客 84

[Vijos P1843] Noip2013Day1T3

A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。 那么我们就先跑一个最大生成树对吧,然后找两点之间

wuzhuangtai00的专栏 1806

[NOIP2013提高组]货车运输

题目:洛谷P1967、Vijos P1843、codevs3287。 题目大意:有n个城市m条道路,每条道路有一个限重,规定货车运货不能超过限重。有一些询问,问你两个城市之间一次最多能运多少重的货(可能无法到达)。 解题思路:首先,要保证原来连通的点连通,限重要尽可能大,所以最大生成树。然后对每个询问找两个点的最近公共祖先,然后求出两点路径上最大限重的最小值即可。 用倍增求LCA,...

269

NOIP2013复赛提高组3题

vijos1842,1843,1846华容道代码题调代码时间是写代码时间不知道多少倍题解时间vijos1842vijos地址:https://vijos.org/p/1842描述涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑i=1n(ai−bi)2,其中 ai 表示第一列火柴中第 i 个火柴的高度,b

AzureHH的博客 495

刷题记录

faebdc老师给的题,noip前尽量都刷完!QWQ 模拟搜索 vijos 1497 立体图 1980 斗地主 2029 时间复杂度(√) 1755 靶形数独(√) 1738 Mayan游戏(√) 1101 传染病控制(√) bzoj 1033 杀蚂蚁 1972 猪国杀 2550 公式编辑器 数论 vijos 1753 HankSon的趣味题 1781 同余方程 1910 解方程 组合数学 vij...

M_oisture的博客 239

8.3-8.7 usaco

summary:38 vijos1002:青蛙跳河。 dp+压缩。距离大于100可以直接%100.然后数据范围小了很多可以dp了。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #defi...

weixin_30326741的博客 168

高效刷题指南:如何用好vijos在线评测系统备战竞赛

在信息学竞赛的备赛过程中,一个稳定、高效的在线评测系统(OJ)至关重要。它不仅提供了海量的题库资源,更是检验算法实现正确性与代码效率的核心平台。对于众多算法学习者而言

2509_93883384的博客 341
上一篇: poj3867(2-sat)
下一篇: vijos1412(第k优背包)
constbh
博客等级 码龄10年 10粉丝 121原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值