POJ 3615 Cow Hurdles

题意: 有 N 个木桩,知道了 m 对木桩的高度差, 问从一点 a 跳到到 b 所需要经过的最小高度差。

分析:  将 Floyed 作一点改动 ,松弛操作 变为 g[i][j]=min(g[i][j],max(g[i][k],g[k][j]))

#include<stdio.h>
#include<string.h>
#define INF 0x1f1f1f
int min(int a,int b){ return a<b?a:b;}
int max(int a,int b){ return a>b?a:b;}
int g[305][305];
int main()
{
    int n,m,i,j,k,t,a,b,w;
    while(scanf("%d%d%d",&n,&m,&t)!=EOF)
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                g[i][j]=INF;
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&w);
            g[a][b]=w;
        }
        for(k=1;k<=n;k++)
            for(i=1;i<=n;i++)
                if(g[i][k]!=INF)
                for(j=1;j<=n;j++)
                    g[i][j]=min(g[i][j],max(g[i][k],g[k][j]));
        while(t--)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",g[a][b]==INF?-1:g[a][b]);
        }
        
    }
    return 0;
}

 

posted @ 2012-08-04 20:07  'wind  阅读(179)  评论(0编辑  收藏  举报