题意描述

Cow Toll Paths G

这道题翻译的是真的不错,特别是第一句话

给定一张有 \(n\) 个点 \(m\) 条边的无向图,每条边有边权,每个点有点权。

两点之间的路径长度为所有边权 + 点权的最大值,求 \(q\) 组 \(s\to t\) 的最短路径。

算法分析

数据范围 \(n\leq 250\)(和谐数字)Floyd 乱搞没跑了。

但是这道题唯一与普通全源最短路的不同之处在于,这道题要求一个最大点权。

一开始我的想法是二分找最小点权,就是每次只走点权 < mid 的点跑 dijkscal。

但是复杂度好像并不是很低(能过?),所以要有一个更强的优化。(而且不是说好了用 Floyd 吗)

首先,你学习 Floyd 如果仅仅停留在背那 5 行代码的话就太可悲了,Floyd 最重要的是它的原理呀。

为什么最外层循环是 k?因为 k 是中间节点,所以这里有一个性质:

当 Floyd 算法遍历到 \(k\) 时,当前的 \(dis(i,j)\) 除去 \(i,j\) 两个端点外,中途经过的点都 \(<k\)。

那么利用这个性质我们可以有一个很高效的算法(\(O(n^3)\) 叫高效):

  1. 对于每个点按照点权从小到大来排序。
  2. Floyd 时,最大点权一定是 \((i,j,k)\) 三点中的一个。

然后每次仅边权和答案两个数组分开计算即可。

代码实现

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 300
using namespace std; int n,m,q,d[N][N],dis[N][N],rank[N];
struct node{
int nu,id;
}a[N]; int read(){
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0' && c<='9') x=x*10+c-48,c=getchar();
return x*f;
} bool cmp(node a,node b){return a.nu==b.nu?a.id<b.id:a.nu<b.nu;} int main(){
memset(d,0x3f,sizeof(d));
memset(dis,0x3f,sizeof(dis));
n=read(),m=read(),q=read();
for(int i=1;i<=n;i++)
a[i].nu=read(),a[i].id=i,d[i][i]=0;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
rank[a[i].id]=i;
int u,v,w;
for(int i=1;i<=m;i++)
u=read(),v=read(),w=read(),d[rank[u]][rank[v]]=d[rank[v]][rank[u]]=min(d[rank[u]][rank[v]],w);
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(i==j) continue;
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
dis[i][j]=min(dis[i][j],d[i][j]+max(a[k].nu,max(a[i].nu,a[j].nu)));
}
for(int i=1;i<=q;i++)
u=read(),v=read(),printf("%d\n",dis[rank[u]][rank[v]]);
return 0;
}

完结撒花

P2966 [USACO09DEC]Cow Toll Paths G的更多相关文章

  1. [USACO09DEC] Cow Toll Paths

    https://www.luogu.org/problem/show?pid=2966 题目描述 Like everyone else, FJ is always thinking up ways t ...

  2. 【洛谷P2966】Cow Toll Paths

    题目大意:给定 N 个节点,M 条边的无向图,边有边权,点有点权,现给出 Q 个询问,每个询问查询两个节点之间的最短路径,这里最短路径的定义是两个节点之间的最短路径与这条路径中经过的节点点权的最大值之 ...

  3. P2966 [USACO09DEC]牛收费路径Cow Toll Paths

    P2966 [USACO09DEC]牛收费路径Cow Toll Paths 题目描述 Like everyone else, FJ is always thinking up ways to incr ...

  4. Luogu P2966 [USACO09DEC]牛收费路径Cow Toll Paths

    题目描述 Like everyone else, FJ is always thinking up ways to increase his revenue. To this end, he has ...

  5. 洛谷 P2966 [USACO09DEC]牛收费路径Cow Toll Paths

    题目描述 Like everyone else, FJ is always thinking up ways to increase his revenue. To this end, he has ...

  6. [Luogu P2966][BZOJ 1774][USACO09DEC]牛收费路径Cow Toll Paths

    原题全英文的,粘贴个翻译题面,经过一定的修改. 跟所有人一样,农夫约翰以宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道 ...

  7. [USACO09DEC]牛收费路径Cow Toll Paths(floyd、加路径上最大点权值的最短路径)

    https://www.luogu.org/problem/P2966 题目描述 Like everyone else, FJ is always thinking up ways to increa ...

  8. <USACO09DEC>过路费Cow Toll Pathsの思路

    啊好气 在洛谷上A了之后 隔壁jzoj总wa 迷茫了很久.发现那题要文件输入输出 生气 肥肠不爽 Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦 ...

  9. [USACO09DEC]牛收费路径Cow Toll Paths

    跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费. 农场中 ...

随机推荐

  1. vue安装教程

    Vue.js 安装教程 安装node.js https://nodejs.org/zh-cn/download/ 选择一个适合自己电脑的版本下载 下载成功, 直接安装, 全部点击下一步 然后输入 黑窗 ...

  2. Harmony OS 开发避坑指南——DevEco Device Tool 安装配置

    Harmony OS 开发指南--DevEco Device Tool 安装配置 本文介绍如何在Windows主机上安装DevEco Device Tool工具. 坑点总结: 国内部分网络环境下,安装 ...

  3. 开源两个spring api项目

    开源两个spring api项目 转载请注明出处: https://www.cnblogs.com/funnyzpc/p/13762616.html 工作也有五年有余了,中间一直迫于时间或能力没从零开 ...

  4. 音频数据增强及python实现

    博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never/p/13404523.html 音频时域波形具有以下特征:音调,响度,质量.我们在进行数据增强时,最好只 ...

  5. 探索与英特尔XDK

    下载Geolocation.rar - 6.3 KB 下载Abhishek3.rar - 425.1 KB 下载Abhishek3.crosswalk.x86.20140824201436.rar - ...

  6. Windows 系统蓝屏错误小全

    0 0x00000000 作业完成. 1 0x00000001 不正确的函数. 2 0x00000002 系统找不到指定的档案. 3 0x00000003 系统找不到指定的路径. 4 0x000000 ...

  7. 最新最最最简单的Snagit傻瓜式破解教程(带下载地址)

    最新最最最简单的Snagit傻瓜式破解教程(带下载地址) 下载地址 直接滑至文章底部下载 软件介绍 一个非常著名的优秀屏幕.文本和视频捕获.编辑与转换软件.可以捕获Windows屏幕.DOS屏幕:RM ...

  8. Rust之路(0)

    Rust--一个2012年出现,2015年推出1.0版本的"年轻"语言.在 2016 至 2018 年的 stack overflow 开发人员调查中,被评比为 "最受欢 ...

  9. linux学习(一)--启动文件bootsect.s

     这是linux由BIOS加载后执行的第一段的启动程序代码,即文件 boot/bootsect.s  首先附图,简单介绍一下从开机加电到第一段linux代码执行的简要过程 1 .globl begte ...

  10. 深入理解RabbitMQ中的prefetch_count参数

    前提 在某一次用户标签服务中大量用到异步流程,使用了RabbitMQ进行解耦.其中,为了提高消费者的处理效率针对了不同节点任务的消费者线程数和prefetch_count参数都做了调整和测试,得到一个 ...