1 条题解

  • 0
    @ 2024-12-24 9:59:28

    C++ :

    #include <cstdio>
    #include <cstring>
    #include <queue>
     
    using namespace std;
     
    struct Edge{
        int v,w,nx;
    };
     
    Edge edge[100001];
    int headlist[101],n,m,st,en,q,b,t,a,map[101][101]={0};
    double ans[101][101],dx[101][1001];
     
    struct Point{
        int id,sw;
    };
     
    queue<Point> que;bool ex[101][1001]={0};
    Point in,temp;
     
    void spfa()
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dx[i][j]=100000000.0;
        dx[st][0]=0;
        in.id=st;
        in.sw=0;
        que.push(in);
        while(!que.empty())
        {
            in=que.front();
            que.pop();ex[in.id][in.sw]=0;
            for(int i=headlist[in.id];i!=-1;i=edge[i].nx)
            {
                if(dx[edge[i].v][in.sw+1]>dx[in.id][in.sw]+edge[i].w)
                {
                    dx[edge[i].v][in.sw+1]=dx[in.id][in.sw]+edge[i].w;
                    if(!ex[edge[i].v][in.sw+1])
                    {
                        ex[edge[i].v][in.sw+1]=1;
                        temp.id=edge[i].v;
                        temp.sw=in.sw+1;
                        que.push(temp);
                    }
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            if(st==i) continue;
            double min=100000000.0;
            for(int j=1;j<=n;j++)
            {
                if(dx[i][j]!=100000000.0&&dx[i][j]/(double)j<min)
                {
                    min=dx[i][j]/(double)j;
                }
            }
            if(min!=100000000.0)
                ans[st][i]=min;
            else
                ans[st][i]=-1;
        }
             
    }
     
    int main()
    {
        //freopen("path.in","r",stdin);
        //freopen("path.out","w",stdout);
        memset(headlist,-1,sizeof(headlist));
        memset(ans,127,sizeof(ans));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&t);
            if(map[a][b]==0||t<map[a][b])
            {
                map[a][b]=t;
                edge[i].v=b;
                edge[i].nx=headlist[a];
                edge[i].w=t;
                headlist[a]=i;
            }
     
        }
        for(int i=1;i<=n;i++)
        {
            st=i;
            spfa();
        }
        scanf("%d",&q);
        for(int i=1;i<=q;i++)
        {
            scanf("%d%d",&st,&en);
            if(ans[st][en]==-1)
                printf("OMG!\n");
            else
                printf("%.3lf\n",(double)((int)(ans[st][en]*1000+0.5))/1000);
        }
        return 0;
    }
    
    • 1

    信息

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