码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1070 拆点 费用流

时间:2017-07-15 16:54:08      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:struct   problem   problems   out   print   个数   front   中心   memory   

1070: [SCOI2007]修车

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 5860  Solved: 2487
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

2 2
3 2
1 4

Sample Output

1.50
 
把修车师傅拆成 n*m个修车师傅 然后具体 //  还是看这里吧http://hzwer.com/2877.html
 
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1000;
const int M=5e5+88;
const int INF=0x3f3f3f3f;
int mp[88][11];
struct node{
   int u,v,flow,cost,next;
}e[M];
int tot,head[N],pre[N],C[N],F[N],V[N],n,m;
void add(int u,int v,int flow,int cost){
   e[tot].u=u;e[tot].v=v;e[tot].flow=flow;e[tot].cost=cost;e[tot].next=head[u];head[u]=tot++;
   e[tot].u=v;e[tot].v=u;e[tot].flow=0;e[tot].cost=-cost;e[tot].next=head[v];head[v]=tot++;
}
int SPFA(int s,int t){
    memset(pre,-1,sizeof(pre));
    for(int i=1;i<=t+1;++i) F[i]=0,C[i]=INF,V[i]=0;
    queue<int>Q;
    Q.push(s);
    C[0]=0,F[0]=INF,V[0]=1;
    while(!Q.empty()){
        int u=Q.front();
        Q.pop();
        V[u]=0;
        for(int i=head[u];i+1;i=e[i].next){
            int v=e[i].v,f=e[i].flow,c=e[i].cost;
            if(f>0&&C[v]>C[u]+c) {
                C[v]=C[u]+c;
                pre[v]=i;
                F[v]=min(f,F[u]);
                if(!V[v]) V[v]=1,Q.push(v);
            }
        }
    }
    return F[t];
}
int MCMF(int s,int t){
    int ans=0,temp;
    while(temp=SPFA(s,t)){
        for(int i=pre[t];i+1;i=pre[e[i].u]) {
            ans+=temp*e[i].cost;
            e[i].flow-=temp;
            e[i^1].flow+=temp;
        }
    }
    return ans;
}
int main(){
   memset(head,-1,sizeof(head));
   scanf("%d%d",&m,&n);
   for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    scanf("%d",&mp[i][j]);//mp[i][j],顾客--修车人员
   int st=0,ed=m*n+n+1;
   for(int i=1;i<=n*m;++i) add(0,i,1,0);
    for(int i=n*m+1;i<=n*m+n;++i) add(i,ed,1,0);
    for(int i=1;i<=m;++i)
        for(int j=1;j<=n;++j)
        for(int k=1;k<=n;++k)
       add((i-1)*n+j,n*m+k,1,mp[k][i]*j);
    int ct=MCMF(st,ed);
    printf("%.2f\n",double(ct)/n);
}
 

BZOJ 1070 拆点 费用流

标签:struct   problem   problems   out   print   个数   front   中心   memory   

原文地址:http://www.cnblogs.com/mfys/p/7182910.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!