bzoj 1070: [SCOI2007]修车(费用流)[省选计划系列]
2016-12-26 10:42
387 查看
1070: [SCOI2007]修车
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 4977 Solved: 2048
[Submit][Status][Discuss]
Description
同一时刻有N位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最
小。 说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。
Input
第一行有两个m,n,表示技术人员数与顾客数。 接下来n行,每行m个整数。第i+1行第j个数表示第j位技术人员维修第i辆车需要用的时间T。
Output
最小平均等待时间,答案精确到小数点后2位。Sample Input
2 23 2
1 4
Sample Output
1.50HINT
数据范围: (2<=M<=9,1<=N<=60), (1<=T<=1000)平均值?
吓唬人的!
谈谈我的心路历程:
1.本题实际是求总等待时间
2.数据范围很诡异(以为是暴搜[捂脸])
-----------------------
3,忍不住看了题解是费用流,瞄了一眼就关掉题解顺下去自己yy
---------------------------------------------------
4.对于每个修理工拆n个点,表示倒数修第i个车的修理工
5.s向每辆车连容量为1,费用为0的边。
6.每个时刻的修理工向t连容量为1,费用为0的边
7.每辆车i向修倒数第j个车的k修理工连容量为1,费用为j*c[k][i]
然后跑费用流就好了。。。
get_新技能:
网络流建图时可以将一个点按状态拆成多个点。
附代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<string> #include<climits> #include<queue> #include<stack> #include<map> #include<set> #define N 50005 #define M 1000006 #define inf 1<<26 using namespace std; int read() { int x=0,f=1;char ch; while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m,s,t; int tme[101][101]; int head ,pos=-1; struct edge{int u,v,cost,flow,next;}e[M]; void add(int a,int b,int cost,int flow) {pos++;e[pos].v=b,e[pos].u=a,e[pos].cost=cost,e[pos].flow=flow;e[pos].next=head[a],head[a]=pos;} void insert(int a,int b,int cost,int flow){add(a,b,cost,flow);add(b,a,-cost,0);} queue<int>Q;bool vis ;int dis ,pp ; bool spfa() { for(int i=s;i<=t;i++)vis[i]=0,dis[i]=inf; Q.push(s);dis[s]=0;vis[s]=1; while(!Q.empty()) { int u=Q.front();Q.pop();vis[u]=0; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].v; if(e[i].flow<=0)continue; if(dis[v]>dis[u]+e[i].cost) { dis[v]=dis[u]+e[i].cost; pp[v]=i; if(!vis[v]) { vis[v]=1; Q.push(v); } } } }return dis[t]!=inf; } int mcmf() { int ret=0; while(spfa()) { int minf=inf+1; for(int i=pp[t];i!=-1;i=pp[e[i].u]) minf=min(e[i].flow,minf); for(int i=pp[t];i!=-1;i=pp[e[i].u]) e[i].flow-=minf,e[i^1].flow+=minf; ret+=minf*dis[t]; }return ret; } void build() { for(int i=1;i<=n;i++) insert(s,i,0,1); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) insert(n*i+j,t,0,1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) tme[i][j]=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=1;k<=n;k++) insert(i,n*j+k,k*tme[i][j],1); } void init() { memset(head,-1,sizeof(head)); memset(pp,-1,sizeof(pp)); } int main() { // freopen("in.txt","r",stdin); // freopen("my.txt","w",stdout); m=read(),n=read();init(); s=0,t=(m+1)*n+1;build(); printf("%.2lf\n",(mcmf()+0.0)/n); }
相关文章推荐
- BZOJ 1070: [SCOI2007]修车 费用流
- 【bzoj 1070】【codevs 2436】[SCOI2007]修车(费用流)
- 【BZOJ 1070】[SCOI2007]修车 费用流
- bzoj 1070: [SCOI2007]修车(费用流)
- [bzoj1070][SCOI2007]修车_费用流
- BZOJ 1070 [SCOI2007]修车【费用流
- BZOJ 1070: [SCOI2007]修车(费用流)
- [BZOJ1070]SCOI2007修车|费用流
- bzoj1070 [SCOI2007]修车 费用流
- [bzoj1070][SCOI2007]修车【费用流】
- 【BZOJ】1070: [SCOI2007]修车(费用流+特殊的技巧)
- [BZOJ1070] [SCOI2007]修车 && 二分图最佳完美匹配 或 费用流
- [BZOJ 1070][SCOI2007]修车:费用流
- [SCOI2007][bzoj1070] 修车 [费用流]
- bzoj 1066: [SCOI2007]蜥蜴(网络流)[省选计划系列]
- [BZOJ 1070] [SCOI2007] 修车 【费用流】
- 【费用流丨二分图最佳匹配】 [SCOI 2007] bzoj1070 修车
- 【BZOJ1070】[SCOI2007]修车 费用流
- [BZOJ1070][SCOI2007]修车(费用流)
- bzoj 1070: [SCOI2007]修车 费用流