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

时间:2021-07-19 21:26:24

原题全英文的,粘贴个翻译题面,经过一定的修改。

跟所有人一样,农夫约翰以宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之道。为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都要向农夫约翰上交过路费。 农场中由N(1 <= N <= 250)片草地(标号为1到N),并且有M(1 <= M <= 10000)条双向道路连接草地i和j(1 <= i,j <= N)。

奶牛们从任意一片草地出发可以抵达任意一片的草地。FJ已经在连接i和j的双向道路上设置一个过路费L[i] (1 <= L[i] <= 100,000)。可能有多条道路连接相同的两片草地,但是不存在一条道路连接一片草地和这片草地本身。最值得庆幸的是,奶牛从任意一篇草地出发,经过一系列的路径,总是可以抵达其它的任意一片草地。 除了贪得无厌,叫兽都不知道该说什么好。

FJ竟然在每片草地上面也设置了一个过路费C[i] (1 <= C[i] <= 100000)。从一片草地到另外一片草地的费用,是经过的所有道路的过路 费之和,加上经过的所有的草地(包括起点和终点)的过路费的最大值。 任劳任怨的牛们希望去调查一下她们应该选择那一条路径。

她们要你写一个程序,接受K(1 <= K <= 10,000)个问题并且输出每个询问对应的最小花费。第i个问题包含两个数字s[i] 和t[i](1 <= s[i] <= N; 1 <= t[i] <= N; s[i] != t[i]),表示起点和终点的草地。

---------------------------------------------------------------分割线QAQ----------------------------------------------------------------------

看下数据范围,n = 250,而且询问是多源最短路,显然一套floyd就能处理。再考虑一下要加上路径上的点权最大值。维护两个数组dis和ans,dis是floyd板子最短路,ans是加上点权之后的最短路,分别维护比较方便。我们可以按点权从小到大的顺序枚举中转点k,由于k是从小到大枚举的,所以可以取最后的k作为i->j的路径上除i,j外点权的最大值,但由于i,j从1到n枚举,所以再和i,j取max就是路径上最大的点权。

参考代码:

#include<cstdio>
#include<algorithm>
using namespace std;
#define qwq 255
int dis[qwq][qwq],ans[qwq][qwq],id[qwq];
int n,m,t;
struct node
{
int id;
int val;
friend bool operator < (node a,node b)
{
if(a.val == b.val) return a.id < b.id;
return a.val < b.val;
}
}a[qwq];
void floyd()
{
for(int k = ;k <= n;k++)
{
for(int i = ;i <= n;i++)
{
for(int j = ;j <= n;j++)
{
dis[j][i] = dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);//标准的floyd
ans[j][i] = ans[i][j] = min(ans[i][j],dis[i][j] + max(a[k].val,max(a[i].val,a[j].val)));//对i->j的最短路,枚举中转点点权最大值
}
}
}
return;
}
int main()
{
scanf("%d %d %d",&n,&m,&t);
for(int i = ;i <= n;i++)
{
scanf("%d",&a[i].val);
ans[i][i] = a[i].val;
a[i].id = i;
}
for(int i = ;i <= n;i++)
{
for(int j = ;j <= n;j++)
{
dis[j][i] = dis[i][j] = 1e9;
if(i != j) ans[i][j] = ans[j][i] = 1e9;
}
dis[i][i] = ;
}
sort(a + ,a + n + );
for(int i = ;i <= n;i++)
id[a[i].id] = i;
for(int i = ;i <= m;i++)
{
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
if(w < dis[id[u]][id[v]]) dis[id[u]][id[v]] = dis[id[v]][id[u]] = w;
}
floyd();
while(t--)
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",ans[id[a]][id[b]]);
} }

[Luogu P2966][BZOJ 1774][USACO09DEC]牛收费路径Cow Toll Paths的更多相关文章

  1. P2966 &lbrack;USACO09DEC&rsqb;牛收费路径Cow Toll Paths

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

  2. Luogu P2966 &lbrack;USACO09DEC&rsqb;牛收费路径Cow Toll Paths

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

  3. 洛谷 P2966 &lbrack;USACO09DEC&rsqb;牛收费路径Cow Toll Paths

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

  4. &lbrack;USACO09DEC&rsqb;牛收费路径Cow Toll Paths(floyd、加路径上最大点权值的最短路径)

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

  5. &lbrack;USACO09DEC&rsqb;牛收费路径Cow Toll Paths

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

  6. 洛谷 2966 2966 &lbrack;USACO09DEC&rsqb;牛收费路径Cow Toll Paths

    [题意概述] 给出一个图,点有正点权,边有正边权,通过两点的代价为两点间的最短路加上路径通过的点的点权最大值. 有M个询问,每次询问通过两点的代价. [题解] 先把点按照点权从小到大排序,然后按照这个 ...

  7. 【&lbrack;USACO09DEC&rsqb;牛收费路径Cow Toll Paths】

    很妙的一道题,我之前一直是用一个非常暴力的做法 就是枚举点权跑堆优化dijkstra 但是询问次数太多了 于是一直只有50分 今天终于抄做了这道题,不贴代码了,只说一下对这道题的理解 首先点权和边权不 ...

  8. 「Luogu 1821」&lbrack;USACO07FEB&rsqb;银牛派对Silver Cow Party

    更好的阅读体验 Portal Portal1: Luogu Portal2: POJ Description One cow from each of N farms \((1 \le N \le 1 ...

  9. P2966 &lbrack;USACO09DEC&rsqb;Cow Toll Paths G

    题意描述 Cow Toll Paths G 这道题翻译的是真的不错,特别是第一句话 给定一张有 \(n\) 个点 \(m\) 条边的无向图,每条边有边权,每个点有点权. 两点之间的路径长度为所有边权 ...

随机推荐

  1. bzoj1024搜索

    进度1/10mark(感觉完不成了) 事实上我刚看到题目一下子慌了,,,我在想怎么二分一块的长宽,然后验证 然而极其难写 于是想有没有暴力,举一些例子模拟一下 然后发现切割是有很明显的限制的:每次切割 ...

  2. Jade之Code

    Code jade支持内嵌js的代码到jade代码之中. Unbuffered Code 无缓冲代码以-符号开始,无任何额外输出(文本是什么即是什么). jade: - for (var x = 0; ...

  3. Windows客户端C&sol;C&plus;&plus;编程规范&OpenCurlyDoubleQuote;建议”——风格

    本文来自:http://blog.csdn.net/breaksoftware/article/details/37935459 命名风格也非常适用于C# 9 风格 9.1 优先使用匈牙利命名法 等级 ...

  4. Solr中初学Demo

    import java.util.Collection; import java.util.Date; import org.apache.solr.client.solrj.SolrQuery; i ...

  5. App&lowbar;Code

    App_Code,文件夹是·NET平台下.在创建网站时,系统为类自动放的位置.它位于Web应用程序根目录下,其存储所有应当作为应用程序的一部分动态编译的类文件.这些类文件自 动链接到应用程序,而不需要 ...

  6. rabbitMq与spring boot搭配实现监听

    在我前面有一篇博客说到了rabbitMq实现与zk类似的watch功能,但是那一篇博客没有代码实例,后面自己补了一个demo,便于理解.demo中主要利用spring boot的配置方式, 一.消费者 ...

  7. C&plus;&plus;11中智能指针的原理、使用、实现

    目录 理解智能指针的原理 智能指针的使用 智能指针的设计和实现 1.智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理.程序员自己管理堆内存可以提高了程序 ...

  8. es6 初级之---const 和 默认参数

    1. const 的定义: 1.1 常量定义的时候要赋值,不赋值是会报错的: <!DOCTYPE html> <html lang="en"> <he ...

  9. SHUOJ - 算法题1 矩阵连乘问题(区间dp)

    链接:http://acmoj.shu.edu.cn/problem/24/ 分析:设\(dp[i][j]\)为矩阵\(A[i:j]\)所需的最少乘法次数,则有dp方程:\(dp[i][j]=min\ ...

  10. vue中使用window&period;open会在url前自动添加本地服务器的地址bug修复

    不能写成www.baidu.com 需要写成https://www.baidu.com