奶牛篱笆
作者:互联网
【问题描述】
FJ想让奶牛们准备乡村跳绳比赛,所以贝茜和一群奶牛都在准备跳过篱笆。
因为它们都太累了,它们都想用尽量少的能量去跳过尽量高的篱笆。
显然,跳过几个矮篱笆对奶牛来说并不困难,但跳过一个高的篱笆还是有压力的。因此,奶牛们只关心高度在它们能跳过最高的篱笆以下的篱笆。
奶牛们的练习房有 N 个位置,方便起见,我们用 1..N 来标记。一个有 M 个元素的集合,表示连接一对位置的单向道路,也被标记为 1..M。道路 i 从位置 Si 到位置 Ei 并且包含一个篱笆高度 Hi。奶牛们在它们经过的路上必须跳过篱笆。
奶牛有 T 个任务要完成。任务 i 包含两个不同的数 Ai 和 Bi(1≤Ai,Bi≤N),表示一头奶牛必须从位置 Ai 到位置 Bi (通过穿过一条或多条路)。奶牛们当它们从Ai 到 Bi 时,想走一条跳过的最高的篱笆最小的路。你的任务是写一个程序计算出这个最小的高度。
【输入格式】
第一行:三个用空格隔开的整数:N,M 和 T。
第二行至第 M+1 行:第 i+1 行包含三个用空格隔开的整数:Si,Ei 和 Hi。
第 M+2M+2 行至第M+T+1行:第 i+M+1 行包含两个用空格隔开的用来描述任务 ii 的整数 Ai和 Bi。
【输出格式】
第一行至第 T 行:第 i 行包含任务 i的结果,要求输出满足条件的最小高度.如果在两个位置中不可能满足条件则输出 -1。
【输入输出样例】
Input
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
Output
4
8
-1
【数据说明】
对于 100% 的数据 1≤N≤500,1≤m≤25000,1≤T≤40000,边权不超过 10^6。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=505; 4 const int oo=0x3f3f3f3f; 5 int N,M,T; 6 int dist[maxn][maxn]; 7 void init() 8 { 9 cin>>N>>M>>T; 10 for(int i=1;i<=N;i++) 11 for(int j=1;j<=N;j++) 12 dist[i][j]=oo; 13 14 for(int i=1;i<=M;i++) 15 { 16 int x,y,z; 17 scanf("%d%d%d",&x,&y,&z); 18 dist[x][y]=z; 19 } 20 } 21 22 void floyd() 23 { 24 for(int k=1;k<=N;k++) 25 for(int i=1;i<=N;i++) 26 for(int j=1;j<=N;j++) 27 dist[i][j]=min(dist[i][j],max(dist[i][k],dist[k][j])); 28 //i->j的最小的最高篱笆高度=min(i->j的篱笆高度,max(i->k的篱笆高度, k->j的篱笆高度) 29 } 30 31 int main() 32 { 33 init(); 34 floyd(); 35 for(int i=1;i<=T;i++) 36 { 37 int a,b; 38 scanf("%d%d",&a,&b); 39 if(dist[a][b]==oo) printf("-1\n"); 40 else printf("%d\n",dist[a][b]); 41 } 42 return 0; 43 }
标签:int,高度,Bi,Ai,篱笆,奶牛 来源: https://www.cnblogs.com/poised/p/12110716.html