P2966 [USACO09DEC]牛收费路径Cow Toll Paths
题目描述
Like everyone else, FJ is always thinking up ways to increase his revenue. To this end, he has set up a series of tolls that the cows will pay when they traverse the cowpaths throughout the farm.
The cows move from any of the N (1 <= N <= 250) pastures conveniently numbered 1..N to any other pasture over a set of M (1 <= M <= 10,000) bidirectional cowpaths that connect pairs of different pastures A_j and B_j (1 <= A_j <= N; 1 <= B_j <= N). FJ has assigned a toll L_j (1 <= L_j <= 100,000) to the path connecting pastures A_j and B_j.
While there may be multiple cowpaths connecting the same pair of pastures, a cowpath will never connect a pasture to itself. Best of all, a cow can always move from any one pasture to any other pasture by following some sequence of cowpaths.
In an act that can only be described as greedy, FJ has also assigned a toll C_i (1 <= C_i <= 100,000) to every pasture. The cost of moving from one pasture to some different pasture is the sum of the tolls for each of the cowpaths that were traversed plus a *single additional toll* that is the maximum of all the pasture tolls encountered along the way, including the initial and destination pastures.
The patient cows wish to investigate their options. They want you to write a program that accepts K (1 <= K <= 10,000) queries and outputs the minimum cost of trip specified by each query. Query i is a pair of numbers s_i and t_i (1 <= s_i <= N; 1 <= t_i <= N; s_i != t_i) specifying a starting and ending pasture.
Consider this example diagram with five pastures:
The 'edge toll' for the path from pasture 1 to pasture 2 is 3. Pasture 2's 'node toll' is 5.
To travel from pasture 1 to pasture 4, traverse pastures 1 to 3 to 5 to 4. This incurs an edge toll of 2+1+1=4 and a node toll of 4 (since pasture 5's toll is greatest), for a total cost of 4+4=8.
The best way to travel from pasture 2 to pasture 3 is to traverse pastures 2 to 5 to 3. This incurs an edge toll of 3+1=4 and a node toll of 5, for a total cost of 4+5=9.
跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道。为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费。 农场中由N(1 <= N <= 250)片草地(标号为1到N),并且有M(1 <= M <= 10000)条 双向道路连接草地A_j和B_j(1 <= A_j <= N; 1 <= B_j <= N)。
奶牛们从任意一片草 地出发可以抵达任意一片的草地。FJ已经在连接A_j和B_j的双向道路上设置一个过路费L_j (1 <= L_j <= 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),表示起点和终点的草地。
输入输出格式
输入格式:
- Line 1: Three space separated integers: N, M, and K
- Lines 2..N+1: Line i+1 contains a single integer: C_i
- Lines N+2..N+M+1: Line j+N+1 contains three space separated
integers: A_j, B_j, and L_j
- Lines N+M+2..N+M+K+1: Line i+N+M+1 specifies query i using two space-separated integers: s_i and t_i
输出格式:
- Lines 1..K: Line i contains a single integer which is the lowest cost of any route from s_i to t_i
输入输出样例
输入样例#1:
5 7 2
2
5
3
3
4
1 2 3
1 3 2
2 5 3
5 3 1
5 4 1
2 4 3
3 4 4
1 4
2 3
输出样例#1:
8
9
给大家介绍一种不用排序就能AC的方法
(排序的方法请看这位大神的博客:http://www.cnblogs.com/peter-le/p/6014643.html)
我们可以分别记录下从点x到点y 的最短路径的长度和在最短路上的花费
然后就是套Floyd的模板。
但是注意,因为你的长度和花费是分开记录的
所以一遍Floyd跑出来的不一定是最小值
我们可以多跑几遍试试
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 using namespace std;
6 const int MAXN=251;
7 const int maxn=0x7ffffff;
8 void read(int & n)
9 {
10 char c='+';int x=0;
11 while(c<'0'||c>'9')c=getchar();
12 while(c>='0'&&c<='9')
13 {
14 x=x*10+c-48;
15 c=getchar();
16 }
17 n=x;
18
19 }
20 int a[MAXN][MAXN];
21 int spend[MAXN][MAXN];
22 int b[MAXN];
23 int n,m,q;
24 void floyd()
25 {
26 for(int k=1;k<=n;k++)
27 for(int i=1;i<=n;i++)
28 for(int j=1;j<=n;j++)
29 {
30 int p=a[i][k]+a[k][j]+max(spend[i][k],spend[k][j]);
31 if((p<a[i][j]+spend[i][j])&&a[i][k]<maxn&&a[k][j]<maxn)
32 {
33 //a[i][j]=a[i][j]-max(spend[i],spend[j]);
34 a[i][j]=a[i][k]+a[k][j];
35 spend[i][j]=max(spend[i][k],spend[k][j]);
36 }
37 }
38 }
39 int main()
40 {
41 read(n);read(m);read(q);
42 for(int i=1;i<=n;i++)
43 read(b[i]);
44 for(int i=1;i<=n;i++)
45 for(int j=1;j<=n;j++)
46 {
47 if(i==j)
48 a[i][j]=0;
49 else
50 a[i][j]=maxn;
51 }
52
53 for(int i=1;i<=m;i++)
54 {
55 int x,y,z;
56 read(x);read(y);read(z);
57 if(a[x][y]>z)
58 {
59 a[x][y]=z;
60 a[y][x]=z;
61 spend[x][y]=max(b[x],b[y]);
62 spend[y][x]=max(b[x],b[y]);
63 }
64
65 }
66 floyd();
67 floyd();
68 floyd();
69 for(int i=1;i<=q;i++)
70 {
71 int x,y;
72 read(x);read(y);
73 printf("%dn",a[x][y]+spend[x][y]);
74 }
75 return 0;
76 }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++核心准则T.123:使用常量表达式函数在编译时求值
- Java基础 【类之间的关系】
- MySql 学习之路-基础
- (有趣的)项目实战:Java实现计算机自动关机
- 猜生日 Java小游戏
- KDD Cup 2020多模态召回比赛亚军方案与搜索业务应用
- 一文快速入门分库分表(必修课)
- MySQL · 物理备份 · XtraBackup备份原理
- Cortex: 高可用和水平扩展Prometheus监控系统
- 从0开始聊聊自动化静态代码审计工具
- WebSphere XXE 漏洞分析(CVE-2020-4643)
- 专项行动的意外收获—— 2020 年 9 月墨子(Mozi)僵尸网络分析报告
- React 17.0.0-rc.2带来全新的JSX转换
- 下载b站外挂字幕,用 potplayer 播放视频也能看字幕了
- MySQL一个字符集转换的骚操作,酿下性能的苦果