奶牛篱笆

【问题描述】

  FJ想让奶牛们准备乡村跳绳比赛,所以贝茜和一群奶牛都在准备跳过篱笆。

  因为它们都太累了,它们都想用尽量少的能量去跳过尽量高的篱笆。

  显然,跳过几个矮篱笆对奶牛来说并不困难,但跳过一个高的篱笆还是有压力的。因此,奶牛们只关心高度在它们能跳过最高的篱笆以下的篱笆。

  奶牛们的练习房有 N 个位置,方便起见,我们用 1..N 来标记。一个有 M 个元素的集合,表示连接一对位置的单向道路,也被标记为 1..M。道路 i 从位置 Si 到位置 Ei 并且包含一个篱笆高度 Hi。奶牛们在它们经过的路上必须跳过篱笆。

  奶牛有 T 个任务要完成。任务 i 包含两个不同的数 Ai 和 Bi(1Ai,BiN),表示一头奶牛必须从位置 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≤5001≤m≤250001≤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 }

猜你喜欢

转载自www.cnblogs.com/poised/p/12110716.html