zoukankan      html  css  js  c++  java
  • [USACO09DEC]牛收费路径Cow Toll Paths

    跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道。为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费。 农场中由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 
    
    这道题询问数很多,对于每个询问依次求一遍最短路肯定不行,就算能O(M)求也显然不行,
    我们注意到点数N很小,由此想到floyd算法。
    但是floyd算法看起来没法解决点权和边权混合的问题,
    不过由于floyd算法的一个性质使本题可用floyd算法。
    floyd算法最外层循环枚举的是中间点,我们将点按点权从小到大排序,
    这样在floyd算法中,对于路径i->k->j,点权最大的点必然是i、j、k中的1个,
    然后就能计算出答案了。

    时间复杂度:O(N^3)
    考试时直接floyed只有30分,但是多做几次floyed就可以AC,但这不是正解,不考虑
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 using namespace std;
     6 struct zt
     7 {
     8     int x,i;
     9 }c[501];
    10 int n,m,dis[501][501],cost[501][501],p[1001];
    11 bool cmp(zt a,zt b)
    12 {
    13     return a.x<b.x;
    14 }
    15 int gi()
    16 {
    17     char ch=getchar();
    18     int x=0;
    19     while (ch<'0'||ch>'9') ch=getchar();
    20     while (ch>='0'&&ch<='9')
    21     {
    22         x=x*10+ch-'0';
    23         ch=getchar();
    24     }
    25     return x;
    26 }
    27 int main()
    28 {
    29     int q,x,y,z,i,j,k;
    30     cin>>n>>m;
    31     memset(dis,127/3,sizeof(dis));
    32     memset(cost,127/3,sizeof(cost));
    33     for (i=1; i<=n; i++)
    34     {
    35         c[i].x=gi();
    36         c[i].i=i;
    37         p[i]=c[i].x;
    38         dis[i][i]=0;
    39     }
    40     sort(c+1,c+n+1,cmp);
    41     for (i=1; i<=m; i++)
    42     {
    43         x=gi();
    44         y=gi();
    45         z=gi();
    46         dis[x][y]=min(dis[x][y],z);
    47         dis[y][x]=dis[x][y];
    48     }
    49     for (k=1; k<=n; k++)
    50     {
    51         for (i=1; i<=n; i++)
    52             {
    53                 for (j=1; j<=n; j++)
    54                     { 
    55                       dis[i][j]=min(dis[i][c[k].i]+dis[c[k].i][j],dis[i][j]);
    56                       cost[i][j]=min(cost[i][j],dis[i][c[k].i]+dis[c[k].i][j]+max(p[i],max(p[j],c[k].x)));
    57                     }
    58             }
    59     }
    60     cin>>q;
    61     while (q--)
    62     {
    63         scanf("%d%d",&x,&y);
    64         printf("%d
    ",cost[x][y]);
    65     }
    66 }
    
    
    
    
    
  • 相关阅读:
    PAT 解题报告 1009. Product of Polynomials (25)
    PAT 解题报告 1007. Maximum Subsequence Sum (25)
    PAT 解题报告 1003. Emergency (25)
    PAT 解题报告 1004. Counting Leaves (30)
    【转】DataSource高级应用
    tomcat下jndi配置
    java中DriverManager跟DataSource获取getConnection有什么不同?
    理解JDBC和JNDI
    JDBC
    Dive into python 实例学python (2) —— 自省,apihelper
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/7574863.html
Copyright © 2011-2022 走看看