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

    题目描述

    同一时刻有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 <ctype.h>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #define M 50005
    #define inf 0x7fffffff
    using namespace std;
    void read(int &x)
    {
        x=0;bool f=0;
        register char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
        x=f?(~x)+1:x;
    }
    struct Edge
    {
        int next,to,flow,value;
        Edge (int next=0,int to=0,int flow=0,int value=0) : next(next),to(to),flow(flow),value(value) {}
    }edge[M<<1];
    bool vis[M<<1];
    int ti[80][80],m,n,head[M<<1],cnt=1,fa[M<<1],dis[M<<1];
    void insert(int u,int v,int w,int l)
    {
        edge[++cnt]=Edge(head[u],v,w,l);
        head[u]=cnt;
    }
    bool spfa(int s,int t)
    {
        for(int i=0;i<=t;i++) {dis[i]=inf;vis[i]=0;} 
        vis[s]=1;
        dis[s]=0;
        fa[s]=0;
        queue<int>q;
        q.push(s);
        while(!q.empty())
        {
            int x=q.front();
            q.pop();
            vis[x]=0;
            for(int i=head[x];i;i=edge[i].next)
            {
                int v=edge[i].to;
                if(dis[v]>dis[x]+edge[i].value&&edge[i].flow>0)
                {
                    dis[v]=dis[x]+edge[i].value;
                    fa[v]=i;
                    if(!vis[v])
                    {
                        vis[v]=1;
                        q.push(v); 
                    }
                }
            }
        }
        return dis[t]<inf;
    }
    int dinic(int s,int t)
    {
        int cost=0;
        for(;spfa(s,t);)
        {
            int x=dis[t];
            for(int i=t;i!=s;i=edge[fa[i]^1].to)
            {
                edge[fa[i]].flow-=x;
                edge[fa[i]^1].flow+=x;
            }
            cost+=dis[t];
        }
        return cost;
    }
    int main()
    {
        read(m);
        read(n);
        int s=0,t=n*m+n+1;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                read(ti[i][j]);
        for(int i=1;i<=m;i++)
         for(int j=1;j<=n;j++)
          for(int k=1;k<=n;k++)
          {
              insert((i-1)*n+j,n*m+k,1,ti[k][i]*j);
              insert(n*m+k,(i-1)*n+j,0,-ti[k][i]*j);
          }
        for(int i=1;i<=m*n;i++)
        {
            insert(s,i,1,0);
            insert(i,s,0,0);
        }
        for(int i=n*m+1;i<t;i++)
        {
            insert(i,t,1,0);
            insert(t,i,0,0);
        }
        printf("%.2lf",dinic(s,t)*1.0/n);
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    20170519
    20170515
    20170511
    20170509
    20170505
    使用 FirewallD 构建动态防火墙
    Elasticsearch 5.2.1Cluster 搭建
    elk,centos7,filebeat,elasticsearch-head详细安装步骤
    elk,centos7,filebeat,elasticsearch-head集成搭建
    memcached
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7222318.html
Copyright © 2011-2022 走看看