1. 程式人生 > >poj3615 給你一個有向圖,然後對於特定的點A與B,要你求出A到B之間所有可行路徑的單段路距離最大值的最小值.

poj3615 給你一個有向圖,然後對於特定的點A與B,要你求出A到B之間所有可行路徑的單段路距離最大值的最小值.

#include<cstdio>
#include<algorithm>
#define INF 1e9
using namespace std;
const int maxn = 300+10;
int n,m,t;
int d[maxn][maxn];
void floyd()
{
    for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
        if(d[i][k]<INF &&d[k][j]<INF)
            d[i][j]=min(d[i][j],max(d[i][k],d[k][j]));  // 當不同類d[i][k]和d[k][j]合併的時候,取得是max(最大值,因為我們要求i到j這段路內的最大值)。然後當同類路徑值(即兩個d[i][j]可行值)選優時,取得是最小值(因為我們要求所有i到j路徑目的值中的最小值)。
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&t)==3)
    {
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            d[i][j]= i==j?0:INF;
        for(int i=1;i<=m;i++)
        {
            int u,v,height;
            scanf("%d%d%d",&u,&v,&height);
            d[u][v]=height;
        }
        floyd();
        while(t--)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            printf("%d\n",d[u][v]==INF?-1:d[u][v]);
        }
    }
    return 0;
}