1 条题解

  • 0
    @ 2024-12-24 10:06:06

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    #define mem(a,n) memset(a,n,sizeof(a))
    const double INF=0x3f3f3f3f+1.0;
    const double eps=1e-6;
    typedef long long LL;
    const int N=105;
    double d[N][N],t;
    int C,R,t1,tmp,t2;
    struct Edge
    {
        int u,to;
        double v,a;
    };
    queue<Edge>que;
    void floyd()
    {
        for(int k=1;k<=C;k++)for(int i=1;i<=C;i++)for(int j=1;j<=C;j++)if(d[i][j]>d[i][k]+d[k][j])d[i][j]=d[i][k]+d[k][j];
    }
    double solve(double sum)
    {
        Edge tou;
        while(!que.empty())
        {
            tou=que.front();que.pop();
            t=0;
            if(abs(tou.a-1)>eps)t=log(tou.v*log(tou.a))/log(tou.a);t=max(t,d[1][tou.u]);
            sum=min(sum,t+tou.v*pow(tou.a,-t)+d[tou.to][C]);
        }
        return sum;
    }
    int main()
    {
        while(~scanf("%d%d",&C,&R)&&C&&R)
        {
            while(!que.empty())que.pop();
            for(int i=1;i<=C;i++)
                for(int j=1;j<=C;j++)
                    if(i==j)d[i][i]=0;
                    else d[i][j]=INF;
            Edge E;
            for(int i=0;i<R;i++)
            {
                scanf("%d%d%lf%lf",&E.u,&E.to,&E.v,&E.a);t1=E.u,t2=E.to;d[t1][t2]=E.v;d[t2][t1]=E.v;que.push(E);
                tmp=E.u;E.u=E.to;E.to=tmp;que.push(E);
            }
            floyd();
            double ans=d[1][C];
            printf("%.3lf\n",solve(ans));
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1932
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者