洛谷 P2053 [SCOI2007]修车

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 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;
}

 

以上是关于洛谷 P2053 [SCOI2007]修车的主要内容,如果未能解决你的问题,请参考以下文章

luogu P2053 [SCOI2007]修车

[luogu]P2053 [SCOI2007]修车

P2053 [SCOI2007]修车

P2053 [SCOI2007]修车

P2053 [SCOI2007]修车 费用流

P2053 [SCOI2007]修车 费用流