洛谷P2888 [USACO07NOV]牛栏Cow Hurdles floyd

传送门

这一题把floyd的状态方程稍微改一下就行了

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

#include<iostream>
using namespace std;
#define INF 99999999
int n,m,t;
int dp[305][305];
int minn(int a,int b,int c){
    a=min(a,b);
    a=min(a,c);
    return a;
}
void solve()
{
    int i,j;
    cin>>n>>m>>t;
    for(i=1;i<=n;i++)for(j=1;j<=n;j++)dp[i][j]=INF;
    for(i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        dp[a][b]=c;
    }
    for(int k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            {
                if(dp[i][k]!=INF&&dp[k][j]!=INF)//i->k->j有通路
                dp[i][j]=min(dp[i][j],max(dp[i][k],dp[k][j])); 
            }
    for(i=1;i<=t;i++)
    {
        int a,b;
        cin>>a>>b;
        if(dp[a][b]==INF)cout<<"-1\n";
        else cout<<dp[a][b]<<endl;
    }
}
int main()
{
    solve();
}

猜你喜欢

转载自www.cnblogs.com/lyhhahaha/p/10074316.html
今日推荐