zoukankan      html  css  js  c++  java
  • [SCOI2007]修车

    [SCOI2007]修车

    https://www.luogu.org/problem/show?pid=2053

    题目描述

    同一时刻有N位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。

    说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。

    输入输出格式

    输入格式:

    第一行有两个数M,N,表示技术人员数与顾客数。

    接下来n行,每行m个整数。第i+1行第j个数表示第j位技术人员维修第i辆车需要用的时间T。

    输出格式:

    最小平均等待时间,答案精确到小数点后2位。

    输入输出样例

    输入样例#1:
    2 2
    3 2
    1 4
    输出样例#1:
    1.50

    说明

    (2<=M<=9,1<=N<=60), (1<=T<=1000)

    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    int m,n,src,decc,ans;
    int tim[10][61],dis[11*61],pre[11*61];
    bool vis[11*61];
    int front[11*61],to[36000*2],nxt[36000*2],tot=1,cap[36000*2],val[36000*2],from[36000*2];
    void add(int u,int v,int w,int cost)
    {
        to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; cap[tot]=w; val[tot]=cost; from[tot]=u;
        to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; cap[tot]=0; val[tot]=-cost; from[tot]=v;
    }
    bool spfa()
    {
        queue<int>q;
        memset(dis,63,sizeof(dis));
        memset(vis,0,sizeof(vis));
        vis[0]=true;
        dis[0]=0;
        q.push(0);
        int now;
        while(!q.empty())
        {
            now=q.front();
            q.pop(); vis[now]=false;
            for(int i=front[now];i;i=nxt[i])
                if(dis[to[i]]>dis[now]+val[i] && cap[i]>0)
                {
                    dis[to[i]]=dis[now]+val[i];
                    pre[to[i]]=i;
                    if(!vis[to[i]])
                    {
                        q.push(to[i]);
                        vis[to[i]]=true;
                    }
                }
        }
        return dis[decc]<1e9;
    }
    void mcmf()
    {
        int i;
        for(i=pre[decc];from[i];i=pre[from[i]]) 
        {
            ans+=val[i];
            cap[i]--; cap[i^1]++;
        }
        cap[i]--; cap[i^1]++;
    }
    int main()
    {
        scanf("%d%d",&m,&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&tim[j][i]);
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                for(int k=1;k<=n;k++)
                    add(j,(i-1)*n+k+n,1,k*tim[i][j]);
        decc=n*m+n+1;
        for(int i=n+1;i<decc;i++) add(i,decc,1,0);
        for(int i=1;i<=n;i++) add(src,i,1,0);
        while(spfa()) 
        mcmf();
        printf("%.2lf",ans*1.0/n);
    }
  • 相关阅读:
    MyEclipse Tern was unable to complete your request in time
    12.5.2 访问被覆盖的方法
    猎头、培训与咨询的价值(2)【补1】——北漂18年(93)
    12.5.1 通过 @ISA 继承
    从柯洁对战AlphaGo,看商业智能
    jquery ajax POST 例子详解
    利用组合索引优化
    Oracle range 分区表
    Perl 面向对象上
    JSON导出CSV中文乱码解决方案
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/7222403.html
Copyright © 2011-2022 走看看