洛谷AC了,但是牛客上面wa了
查看原帖
洛谷AC了,但是牛客上面wa了
1131955
qq2726157981楼主2025/1/17 11:24

我用dp的思路,但是我是djstra而不是floyd。 dp保存的是在k条边的情况下i到j最小密度。 洛谷我AC了,但是牛客只过了67不知道为什么。 牛客最后输出我尝试小数点后5位也不行,long double也试了,应该不是精度问题,而且我看没有题解是这种做法,希望大佬看看给我解答一下问题在哪里。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m;
#define N 1010
ll e[N],ne[N],h[N];
double w[N];
double dp[60][60][60];
ll idx=1;
#define pdl pair<double,pair<ll,ll>>
void add(ll a,ll b,double c)
{
    e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}

void solve(ll x)
{
    
    priority_queue<pdl,vector<pdl>,greater<pdl>> q;
    q.push({0,{0,x}});
    while(!q.empty())
    {
        auto [d,p]=q.top();
        auto [k,u]=p;
        q.pop();
        for(ll i=h[u];i;i=ne[i])
        {
            if(dp[x][e[i]][k+1]>(d+w[i])/(k+1))
            {
                dp[x][e[i]][k+1]=(d+w[i])/(k+1);
                q.push({d+w[i],{k+1,e[i]}});
            }
        }
    }
    
}

int main()
{
    cin>>n>>m;
    for(ll k=1;k<=55;k++)
    {    
        for(ll i=1;i<=55;i++)
        {
            for(ll j=0;j<=55;j++)
            {
                dp[k][i][j]=1e10;
            }
        }
    }
    for(ll i=1;i<=m;i++)
    {
        ll u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
    }
    for(ll i=1;i<=n;i++)
    solve(i);
    ll q;
    cin>>q;
    for(ll i=1;i<=q;i++)
    {
        ll a,b;
        cin>>a>>b;
        double ans=1e11;
        for(ll j=0;j<=55;j++)
        {
            ans=min(ans,dp[a][b][j]);
        }
        if(ans>1e9)cout<<"OMG!"<<endl;
        else printf("%.3lf\n",ans);
    }
    return 0;
}
2025/1/17 11:24
加载中...