1. 程式人生 > >BZOJ 1641 [Usaco2007 Nov]Cow Hurdles 奶牛跨欄:新版floyd【路徑上最大邊最小】

BZOJ 1641 [Usaco2007 Nov]Cow Hurdles 奶牛跨欄:新版floyd【路徑上最大邊最小】

online ble code problem -1 efi color 最大的 pan

題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=1641

題意:

  給你一個有向圖,n個點(n <= 300),m條邊,邊權為h[i]。

  t個詢問(a,b)。讓你找一條從a到b的路徑,使路徑上最大的邊最小,輸出這個最小值。

題解:

  新版floyd。

  dis[a][b]表示從a到b的路徑中,最大邊的最小值。

  分別枚舉k,i,j,然後取最小:

    dis[i][j] = min(dis[i][j], max(dis[i][k],dis[k][j]))

  dis[a][b]即為答案。

AC Code:

 1 #include <iostream>
 2
#include <stdio.h> 3 #include <string.h> 4 #define MAX_N 305 5 #define INF 10000000 6 7 using namespace std; 8 9 int n,m,t; 10 int dis[MAX_N][MAX_N]; 11 12 void read() 13 { 14 scanf("%d%d%d",&n,&m,&t); 15 memset(dis,0x3f,sizeof(dis)); 16 int a,b,h; 17 for(int
i=0;i<m;i++) 18 { 19 scanf("%d%d%d",&a,&b,&h); 20 dis[a][b]=min(dis[a][b],h); 21 } 22 } 23 24 void floyd() 25 { 26 for(int k=1;k<=n;k++) 27 { 28 for(int i=1;i<=n;i++) 29 { 30 for(int j=1;j<=n;j++) 31 { 32 if
(i!=j && j!=k && i!=k) 33 { 34 dis[i][j]=min(dis[i][j],max(dis[i][k],dis[k][j])); 35 } 36 } 37 } 38 } 39 } 40 41 void work() 42 { 43 floyd(); 44 int a,b; 45 for(int i=0;i<t;i++) 46 { 47 scanf("%d%d",&a,&b); 48 if(dis[a][b]>INF) printf("-1\n"); 49 else printf("%d\n",dis[a][b]); 50 } 51 } 52 53 int main() 54 { 55 read(); 56 work(); 57 }

BZOJ 1641 [Usaco2007 Nov]Cow Hurdles 奶牛跨欄:新版floyd【路徑上最大邊最小】