奶牛篱笆
Posted poised
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了奶牛篱笆相关的知识,希望对你有一定的参考价值。
【问题描述】
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
Output
【数据说明】
对于 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 "); 40 else printf("%d ",dist[a][b]); 41 } 42 return 0; 43 }
以上是关于奶牛篱笆的主要内容,如果未能解决你的问题,请参考以下文章
[Usaco2014 Open]Fair Photography
[Usaco2014 Open]Fair Photography
编程算法 - 篱笆修理(Fence Repair) 代码(C)