zoukankan      html  css  js  c++  java
  • 157. [USACO Nov07] 奶牛跨栏

    157. [USACO Nov07] 奶牛跨栏

    ★★   输入文件:hurdles.in   输出文件:hurdles.out   简单对比
    时间限制:1 s   内存限制:128 MB

    译 by CmYkRgB123

    描述

    Farmer John 想让她的奶牛准备郡级跳跃比赛,贝茜和她的伙伴们正在练习跨栏。她们很累,所以她们想消耗最少的能量来跨栏。

    显然,对于一头奶牛跳过几个矮栏是很容易的,但是高栏却很难。于是,奶牛们总是关心路径上最高的栏的高度。

    奶牛的训练场中有 N (1 ≤ N ≤ 300) 个站台,分别标记为1..N。所有站台之间有M (1 ≤ M ≤ 25,000)条单向路径,第i条路经是从站台Si开始,到站台Ei,其中最高的栏的高度为Hi (1 ≤ Hi ≤ 1,000,000)。无论如何跑,奶牛们都要跨栏。

    奶牛们有 T (1 ≤ T ≤ 40,000) 个训练任务要完成。第 i 个任务包含两个数字 Ai 和 Bi (1 ≤ Ai ≤ N; 1 ≤ Bi ≤ N),表示奶牛必须从站台Ai跑到站台Bi,可以路过别的站台。奶牛们想找一条路径从站台Ai到站台Bi,使路径上最高的栏的高度最小。

    你的任务就是写一个程序,计算出路径上最高的栏的高度的最小值。

    输入

    • 行 1: 两个整数 N, M, T
    • 行 2..M+1: 行 i+1 包含三个整数 Si , Ei , Hi
    • 行 M+2..M+T+1: 行 i+M+1 包含两个整数,表示任务i的起始站台和目标站台: Ai , Bi

    输出

    • 行 1..T: 行 i 为一个整数,表示任务i路径上最高的栏的高度的最小值。如果无法到达,输出 -1。

    输入样例

    5 6 3
    1 2 12
    3 2 8
    1 3 5
    2 5 3
    3 4 4
    2 4 8
    3 4
    1 2
    5 1
    

    输出样例

    4
    8
    -1

    思路:裸Flyoed 注意在求最短路径的时候取一下最大值
    错因: 10001*10001的数组 800M+

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #include<stack>
     8 using namespace std;
     9 const int MAXN=1001;
    10 const int maxn=0x7fffffff;
    11 long long int map[MAXN][MAXN];
    12 int main()
    13 {
    14     freopen("hurdles.in","r",stdin);
    15     freopen("hurdles.out","w",stdout);
    16     int n,m,q;
    17     scanf("%d%d%d",&n,&m,&q);
    18     for(int i=1;i<=n;i++)
    19         for(int j=1;j<=n;j++)
    20             map[i][j]=maxn;
    21     for(int i=1;i<=m;i++)
    22     {
    23         int x,y,z;
    24         scanf("%d%d%d",&x,&y,&z);
    25         map[x][y]=z;
    26     }
    27     for(int k=1;k<=n;k++)
    28     {
    29         for(int i=1;i<=n;i++)
    30         {
    31             for(int j=1;j<=n;j++)
    32             {
    33                 if(map[i][k]!=maxn&&map[k][j]!=maxn)
    34                 if((map[i][j]>map[i][k])&&(map[i][j]>map[k][j]))
    35                 map[i][j]=max(map[i][k],map[k][j]);
    36             }
    37         }
    38     }
    39     for(int i=1;i<=q;i++)
    40     {
    41         int x,y;
    42         scanf("%d%d",&x,&y);
    43         if(map[x][y]!=maxn)
    44         printf("%lld
    ",map[x][y]);
    45         else 
    46         printf("-1");
    47     }
    48     fclose(stdin);
    49     fclose(stdout);
    50     return 0;
    51 }
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #include<stack>
     8 using namespace std;
     9 const int MAXN=1001;
    10 const int maxn=0x7fffffff;
    11 long long int map[MAXN][MAXN];
    12 int main()
    13 {
    14     freopen("hurdles.in","r",stdin);
    15     freopen("hurdles.out","w",stdout);
    16     int n,m,q;
    17     scanf("%d%d%d",&n,&m,&q);
    18     for(int i=1;i<=n;i++)
    19         for(int j=1;j<=n;j++)
    20             map[i][j]=maxn;
    21     for(int i=1;i<=m;i++)
    22     {
    23         int x,y,z;
    24         scanf("%d%d%d",&x,&y,&z);
    25         map[x][y]=z;
    26     }
    27     for(int k=1;k<=n;k++)
    28     {
    29         for(int i=1;i<=n;i++)
    30         {
    31             for(int j=1;j<=n;j++)
    32             {
    33                 if(map[i][k]!=maxn&&map[k][j]!=maxn)
    34                 if((map[i][j]>map[i][k])&&(map[i][j]>map[k][j]))
    35                 map[i][j]=max(map[i][k],map[k][j]);
    36             }
    37         }
    38     }
    39     for(int i=1;i<=q;i++)
    40     {
    41         int x,y;
    42         scanf("%d%d",&x,&y);
    43         if(map[x][y]!=maxn)
    44         printf("%lld
    ",map[x][y]);
    45         else 
    46         printf("-1");
    47     }
    48     fclose(stdin);
    49     fclose(stdout);
    50     return 0;
    51 }
     
  • 相关阅读:
    Alook搭配JS脚本完美食用
    分享小米刷机教程/线刷(工具支持小米华为一加)
    iPhone 无需越狱修改wx+zfb+qq步数
    如果SELECT语句中没有结果,则使用CASE返回字符串
    MSSQLServer 正在显示"正在还原...."
    C# 小技巧
    C#使用Select方法快速获取List集合集合中某个属性的所有值集合
    C#中使用Sum方法对List集合进行求和操作
    sql日期函数
    sql只根据某一字段去重,并保留其他字段
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6730796.html
Copyright © 2011-2022 走看看