题意描述

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. LeetCode刷题总结-动态规划篇

    本文总结LeetCode上有动态规划的算法题,推荐刷题总数为54道.具体考点分析如下图: 1.中心扩展法 题号:132. 分割回文串 II,难度困难 2.背包问题 题号:140. 单词拆分 II,难度 ...

  2. angularCroppie

    下载 angularCroppieangularCroppie 图像Cropper使用Croppie 安装 Npm: Npm安装角croppie 使用 添加依赖项:angular.模块("m ...

  3. 炉石传说酒馆战棋一键拔线(windows)

    小编的业余游戏之一<炉石传说>,这里分享的是现在很火的游戏拔线(跳过约20秒的战斗动画),用夜吹的话说,注意,不是"日你大坝",是"整活",哈哈.小 ...

  4. arcgis-java-100.8.0.jar下载

    链接: https://pan.baidu.com/s/1HoW2IhPvHRw9LBZphxC5Rw 提取码: pexn

  5. ttl转以太网

    ttl转以太网 ttl转以太网ZLSN3007S是实现TTL电平串口转以太网的"超级网口",产品自带网络变压器和RJ45网口,可以方便实现单片机.各类TTL电平串口设备的联网.首先 ...

  6. day19 Pyhton学习 递归函数

    # 函数的递归 : 在一个函数的内部调用它自己 # import sys # sys.setrecursionlimit(1000000) # 设置递归的最大深度 # 总结 # 1.递归函数的定义 : ...

  7. 【全网免费VIP观看】哔哩哔哩番剧解锁大会员-集合了优酷-爱奇艺-腾讯-芒果-乐视-ab站等全网vip视频免费破解去广告-高清普清电视观看-持续更新

    哔哩哔哩番剧解锁大会员-集合了优酷-爱奇艺-腾讯-芒果-乐视-ab站等全网vip视频免费破解去广告-高清普清电视观看-持续更新 前言 突然想看电视,结果 没有VIP 又不想花钱,这免费的不久来啦. 示 ...

  8. 【C语言C++编程入门】程序的可读性和函数的调用!

    一个简单程序的结构 你已经看过一个具体的例子,下面可以了解一些 C程序的基本规则了. 程序由一个或多个函数组成,其中一定有一个名为 main()的函数.函数的描述由函数头和函数体组成.函数头包括预处理 ...

  9. Ubuntu安装zookeeper问题

    在Ubuntu系统安装zookeeper后,启动报错: root@host8:/usr/solrcould/service1/zookeeper-3.5.0-alpha# sh bin/zkServe ...

  10. 面试官:为什么MySQL的索引要使用B+树,而不是其它树?比如B树?

    InnoDB的一棵B+树可以存放多少行数据? 答案:约2千万 为什么是这么多? 因为这是可以算出来的,要搞清楚这个问题,先从InnoDB索引数据结构.数据组织方式说起. 计算机在存储数据的时候,有最小 ...