您的位置:首页 > 其它

157. [USACO Nov07] 奶牛跨栏

2017-04-18 22:03 176 查看

157.[USACONov07]奶牛跨栏

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

译byCmYkRgB123

描述

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

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

奶牛的训练场中有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。

输入样例

563
1212
328
135
253
344
248
34
12
51

输出样例

4
8
-1

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


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
usingnamespacestd;
constintMAXN=1001;
constintmaxn=0x7fffffff;
longlongintmap[MAXN][MAXN];
intmain()
{
freopen("hurdles.in","r",stdin);
freopen("hurdles.out","w",stdout);
intn,m,q;
scanf("%d%d%d",&n,&m,&q);
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
map[i][j]=maxn;
for(inti=1;i<=m;i++)
{
intx,y,z;
scanf("%d%d%d",&x,&y,&z);
map[x][y]=z;
}
for(intk=1;k<=n;k++)
{
for(inti=1;i<=n;i++)
{
for(intj=1;j<=n;j++)
{
if(map[i][k]!=maxn&&map[k][j]!=maxn)
if((map[i][j]>map[i][k])&&(map[i][j]>map[k][j]))
map[i][j]=max(map[i][k],map[k][j]);
}
}
}
for(inti=1;i<=q;i++)
{
intx,y;
scanf("%d%d",&x,&y);
if(map[x][y]!=maxn)
printf("%lld\n",map[x][y]);
else
printf("-1");
}
fclose(stdin);
fclose(stdout);
return0;
}


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
usingnamespacestd;
constintMAXN=1001;
constintmaxn=0x7fffffff;
longlongintmap[MAXN][MAXN];
intmain()
{
freopen("hurdles.in","r",stdin);
freopen("hurdles.out","w",stdout);
intn,m,q;
scanf("%d%d%d",&n,&m,&q);
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
map[i][j]=maxn;
for(inti=1;i<=m;i++)
{
intx,y,z;
scanf("%d%d%d",&x,&y,&z);
map[x][y]=z;
}
for(intk=1;k<=n;k++)
{
for(inti=1;i<=n;i++)
{
for(intj=1;j<=n;j++)
{
if(map[i][k]!=maxn&&map[k][j]!=maxn)
if((map[i][j]>map[i][k])&&(map[i][j]>map[k][j]))
map[i][j]=max(map[i][k],map[k][j]);
}
}
}
for(inti=1;i<=q;i++)
{
intx,y;
scanf("%d%d",&x,&y);
if(map[x][y]!=maxn)
printf("%lld\n",map[x][y]);
else
printf("-1");
}
fclose(stdin);
fclose(stdout);
return0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: