bzoj1774 USACO 2009 Dec Gold 2.Cow Toll Paths 过路费 翻译+题解

来源:互联网 发布:ios与安卓的区别 知乎 编辑:程序博客网 时间:2024/05/28 23:12

Description

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.

Input

* 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

Output

* Lines 1..K: Line i contains a single integer which is the lowest
        cost of any route from s_i to t_i

Sample Input

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

Sample Output

8
9

以下是翻译:

Description

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

  农场中由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),表示起点和终点的草地。

  考虑下面这个包含5片草地的样例图像:

  

  从草地1到草地3的道路的“边过路费”为3,草地2的“点过路费”为5。

  要从草地1走到草地4,可以从草地1走到草地3再走到草地5最后抵达草地4。如果这么走的话,需要的“边过路费”为2+1+1=4,需要的点过路费为4(草地5的点过路费最大),所以总的花费为4+4=8。

  而从草地2到草地3的最佳路径是从草地2出发,抵达草地5,最后到达草地3。这么走的话,边过路费为3+1=4,点过路费为5,总花费为4+5=9。

Input

  * 第1行: 三个空格隔开的整数: N, M和K

  * 第2到第N+1行: 第i+1行包含一个单独的整数: C_i

  * 第N+2到第N+M+1行: 第j+N+1行包含3个由空格隔开的整数: A_j, B_j和L_j

  * 第N+M+2倒第N+M+K+1行: 第i+N+M+1行表示第i个问题,包含两个由空格隔开的整数s_i和t_i

Output

  * 第1到第K行: 第i行包含一个单独的整数,表示从s_i到t_i的最小花费。

Sample Input

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

Sample Output

8
9
以下为题解:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int f[251][251],dis[251][251],g[251],s[251];inline bool cmp(int x,int y){return g[x]<g[y];}int main(){int i,a,b,c,j,k,n,m,p,q,t;scanf("%d%d%d",&n,&m,&p);memset(f,1,sizeof(f));memset(dis,1,sizeof(dis));for(i=1;i<=n;i++) {s[i]=i;scanf("%d",&g[i]);f[i][i]=g[i];}sort(s+1,s+n+1,cmp);for(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);dis[a][b]=dis[b][a]=min(dis[a][b],c);}for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++){dis[s[i]][s[j]]=min(dis[s[i]][s[j]],dis[s[i]][s[k]]+dis[s[k]][s[j]]);f[s[i]][s[j]]=min(f[s[i]][s[j]],dis[s[i]][s[j]]+max(g[s[i]],max(g[s[k]],g[s[j]])));}for(i=1;i<=p;i++){scanf("%d%d",&q,&t);if(f[q][t]>=16843010)printf("-1\n");elseprintf("%d\n",f[q][t]);}}


原创粉丝点击